Si vous souhaitez mettre à jour plusieurs modèles en soumettant un formulaire, vous utiliserez probablement FormObject. (Si vous voulez en savoir plus sur FormObject, cliquez ici: [Rails] Veuillez utiliser FormObject)
J'avais des problèmes parce que je ne pouvais pas transmettre les paramètres divisés par date_select
à ce FormObject tel quel. Après avoir déclaré ʻinclude ActiveRecord :: AttributeAssignment` à FormObject, j'ai pu les transmettre tous ensemble, je voudrais donc les présenter ci-dessous. Je vais.
La situation est lorsque vous enregistrez votre anniversaire sur le nouvel écran d'inscription.
Lorsque vous appuyez sur le bouton CreateUser
sur l'image, l'action de création du contrôleur s'exécute. Paramètres divisés en utilisant le mécanisme StrongParameter dans la méthode user_params <ActionController :: Parameters {" birthday (1i) "=>" 2020 "," birthday (2i) "=>" 7 "," birthday (3i) "=>" 13 "} autorisé: 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
Comme indiqué dans @user = Form.new (user_params)
,
Si vous essayez de transmettre les paramètres divisés par la valeur initiale de FormObject, une erreur se produit car il est divisé. <ActionController :: Parameters {" birthday (1i) "=>" 2020 "," birthday (2i) "=>" 7 "," birthday (3i) "=>" 12 "} autorisé: true>
Je veux le passer comme paramètre d'anniversaire.
Par conséquent, si vous déclarez ʻinclude ActiveRecord :: AttributeAssignment`, les paramètres divisés seront passés à l'attribut ensemble. affaire en cours de règlement.
app/forms/form.rb
class Form
include ActiveModel::Model
include ActiveModel::Attributes
#ajouter à
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