我的关联如下:
class Membership < ApplicationRecord
belongs_to :user
end
和
class User < ApplicationRecord
has_many :memberships
end
现在,我有一个创建新成员资格的表格。在此表单中,我还想输入新的用户信息。我正在使用SimpleForm。我的基本结构如下(使用HAML而不是erb文件):
= simple_form_for @membership do |f|
...
= simple_fields_for @user do |uf|
.field= uf.input :firstname, label: 'First Name', required: true
...
= f.button :submit, 'Submit'
@user
是在Memberships控制器(@user = User.new
)上的新操作中设置的实例变量。我想保持这种方式,以便可以对用户属性使用SimpleForm的推断(即uf.input :firstname
映射到firstname
模型上的User
属性)
现在有了这种背景,当我点击提交时,目标是创建一个新的成员资格以及与该成员资格相关联的新用户。如何允许单个关联用户使用参数?
目前我有:
# Never trust parameters from the scary internet, only allow the white list through.
def membership_params
params.require(:membership).permit(users_attributes: [:id, :firstname] )
end
这是请求:
Started POST "/memberships" for ::1 at 2018-10-15 15:08:42 -0600
Processing by MembershipsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"omitted==", "membership"=>{"user"=>{"firstname"=>""}}, "commit"=>"Submit"}
Unpermitted parameter: :user
Unpermitted parameter: :user
Unpermitted parameter: :user
##################### {}
No template found for MembershipsController#create, rendering head :no_content
Completed 204 No Content in 264ms (ActiveRecord: 0.0ms)
我暂时没有模板渲染。
给出以下参数结构:
"membership"=>{"user"=>{"firstname"=>""}}
对于允许的参数,我也尝试了以下方法:
params.require(:membership).permit(user_attributes: [:id, :firstname] )
params.require(:membership).permit(user: [:id, :firstname] )
请注意,我################ {}
。这是我在create操作中使用的手册。 puts '################ ' + membership_params.to_json
。如您所见,它不会产生任何结果。另外,为什么我会记录三遍“不允许的参数”?
更新1 控制器代码:
class MembershipsController < ApplicationController
load_and_authorize_resource
# GET
def new
@membership_plans = Plan.active.sort_by { |plan| plan.sequence }
@user = @membership.build_user
end
# POST
def create
debug_puts(membership_params.to_json)
end
private
# Never trust parameters from the scary internet, only allow the white list through.
def membership_params
params.require(:membership).permit(user_attributes: [:id, :firstname, :lastname] )
end
end
更新2
我不认为这是一个可以接受的答案(这就是为什么我不正式“回答”我的问题),但是我决定要做的是将表格翻转。成员资格和用户之间的关系仍然相同,但是父表单适用于用户:
= simple_form_for @user do |f|
...
= f.simple_fields_for :memberships_attributes do |mf|
...
这意味着我将accepts_nested_attributes_for :membership
放在用户模型上(与成员资格建立has_many关联),所有渲染和参数允许都在用户控制器内完成
# new action in users_controller.rb
def new
@membership_plans = Plan.active.sort_by { |plan| plan.sequence }
@user = User.new
@user.build_membership
end
# Never trust parameters from the scary internet, only allow the white list through.
def user_params
params.require(:user).permit(memberships_attributes: [:id, :field1, :field2] )
end
答案 0 :(得分:1)
您需要在user
的{{1}}操作中为membership
构建。
new
并确保您在memberships_controller
中没有def new
@membership = Membership.new
@user = @membership.build_user
end
而不是user_attributes
users_attributes
更新:
还有一个更重要的代码需要修复。
此
membership_params
应该是
params.require(:membership).permit(user_attributes: [:id, :firstname] )