【问题标题】:Unpermitted parameters on belong_to associationbelongs_to 关联上不允许的参数
【发布时间】:2018-10-15 21:33:18
【问题描述】:

我的关联如下:

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 这是在成员资格控制器 (@user = User.new) 上的新操作中设置的实例变量。我想保持这种方式,这样我就可以使用 SimpleForm 对用户属性的推断(即,uf.input :firstname 映射到 firstname 模型上的 firstname 属性) 现在考虑到这个背景,当我点击提交时,目标是创建一个新的会员资格和一个与该会员资格相关联的新用户。如何允许单个关联用户的参数?

目前我有:

# 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] )

注意我################ {}。这是我在创建操作中的手册。 puts '################ ' + membership_params.to_json。如您所见,它没有产生任何结果。另外,为什么我会记录 3 次“未经允许的参数”?

更新 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

我不认为这是一个可以接受的答案(这就是为什么我没有正式“回答”我的问题),但我决定做的是反转我的形式。 Memberships 和 Users 之间的关系仍然相同,但父表单是针对用户的:

= 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

【问题讨论】:

  • 忘记包含这条重要信息:我在会员模型上有accepts_nested_attributes_for :user

标签: ruby-on-rails simple-form strong-parameters belongs-to


【解决方案1】:

您需要在memberships_controllernew 操作中构建membershipuser

def new
  @membership = Membership.new
  @user = @membership.build_user
end

并确保membership_params 中的user_attributes 不是users_attributes

params.require(:membership).permit(user_attributes: [:id, :firstname] )

更新:

还有一段更重要的代码需要修复。

这个

= simple_fields_for @user do |uf|

应该是

= f.simple_fields_for @user do |uf|

【讨论】:

  • 这是一条有用的信息。构建关联模型比创建一个新模型并手动关联要好,但我仍然是 Unpermitted parameter: :user 消息并打印出 membership_params 仍然没有产生任何结果。
  • 开枪,我希望那是罪魁祸首。我只是在我的原始帖子中将其复制错误!我一直在使用f.simple_fields_for
  • @mtprogrammer 好的,我很想看看控制器代码。特别完整的newcreate 方法。你能用这些更新问题吗?
  • @mtprogrammer 这就是你所拥有的吗?我没有看到@membership的定义
  • load_and_authorize_resource 将创建@membership。拥有@membership = Membership.new 仍然会产生与未经允许的参数相同的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-03
  • 1970-01-01
相关资源
最近更新 更多