Wenn Sie mehrere Modelle durch Senden eines Formulars aktualisieren möchten, verwenden Sie wahrscheinlich FormObject. (Wenn Sie mehr über FormObject erfahren möchten, klicken Sie hier: [Rails] Bitte verwenden Sie FormObject)
Ich hatte Probleme, weil ich die durch date_select
geteilten Parameter nicht so wie sie sind an dieses FormObject übergeben konnte. Als ich" include ActiveRecord :: AttributeAssignment` an FormObject deklarierte, konnte ich sie alle zusammen übergeben, daher möchte ich sie unten vorstellen Ich werde.
Die Situation ist, wenn Sie Ihren Geburtstag auf dem neuen Registrierungsbildschirm registrieren.
Wenn Sie auf dem Bild auf die Schaltfläche "CreateUser" klicken, wird die Erstellungsaktion des Controllers ausgeführt. Geteilte Parameter unter Verwendung des StrongParameter-Mechanismus in der user_params-Methode <ActionController :: Parameters {" Geburtstag (1i) "=>" 2020 "," Geburtstag (2i) "=>" 7 "," Geburtstag (3i) "=>" 13 "} erlaubt: Get true>
.
app/controllers/users_controller.rb
class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
# GET /users
# GET /users.json
def index
@users = User.all
end
# GET /users/1
# GET /users/1.json
def show
end
# GET /users/new
def new
@user = Form.new
end
# GET /users/1/edit
def edit
end
# POST /users
# POST /users.json
def create
@user = Form.new(user_params)
respond_to do |format|
if @user.save
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /users/1
# PATCH/PUT /users/1.json
def update
respond_to do |format|
if @user.update(user_params)
format.html { redirect_to @user, notice: 'User was successfully updated.' }
format.json { render :show, status: :ok, location: @user }
else
format.html { render :edit }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
# DELETE /users/1
# DELETE /users/1.json
def destroy
@user.destroy
respond_to do |format|
format.html { redirect_to users_url, notice: 'User was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_user
@user = User.find(params[:id])
end
# Only allow a list of trusted parameters through.
def user_params
params.require(:user).permit(:birthday)
end
end
app/forms/form.rb
class Form
include ActiveModel::Model
include ActiveModel::Attributes
attribute :birthday, :date
def to_model
User.new(birthday: birthday)
end
def save
return false if invalid?
to_model.save
end
end
Wie in @user = Form.new (user_params)
angegeben,
Wenn Sie versuchen, die geteilten Parameter durch den Anfangswert von FormObject zu übergeben, tritt ein Fehler auf, weil er geteilt ist. <ActionController :: Parameters {" Geburtstag (1i) "=>" 2020 "," Geburtstag (2i) "=>" 7 "," Geburtstag (3i) "=>" 12 "} erlaubt: true>
Ich möchte es als Geburtstagsparameter übergeben.
Wenn Sie "include ActiveRecord :: AttributeAssignment" deklarieren, werden die geteilten Parameter daher zusammen an das Attribut übergeben. Fall wird beigelegt.
app/forms/form.rb
class Form
include ActiveModel::Model
include ActiveModel::Attributes
#hinzufügen
include ActiveRecord::AttributeAssignment
attribute :birthday, :date
def to_model
User.new(birthday: birthday)
end
def save
return false if invalid?
to_model.save
end
end
Recommended Posts