嵌套参数的奇怪行为

时间:2016-09-16 02:37:45

标签: ruby-on-rails ruby-on-rails-4 nested-attributes

我正在使用嵌套参数来体验这种奇怪的行为。 当我尝试保存表单时,它会显示Unpermitted parameter: organization_type

对于我的组织类型我只有一个模型,但我不认为这应该是问题,因为根据我的理解,属性是在用户控制器中处理的

我尝试在表单和控制器白名单中将属性设置为organization_type(单数),但这不起作用。

但是,在表单中,如果我有:organization_types,则该字段将不会显示。

我对此感到很困惑。

快速回顾一下:

  • 我没有OrganizationType
  • 的控制器
  • 在我的表格中::organization_type。如果我复数,则不显示
  • 在Controller白名单中,我有::organization_types_attributes
  • 在用户模型中,我有::organization_types_attributes
  • 的Has_many和accepts_nested

用户模型

class User < ActiveRecord::Base
  has_many :events
  has_many :organization_types
  accepts_nested_attributes_for :organization_types
end

组织类型模型

class OrganizationType < ActiveRecord::Base
  belongs_to :user
  ORG_TYPES = ['health', 'non-profit', 'foo', 'bar']
end

用户控制器

class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]
  before_filter :authenticate_user!

  ...

  def user_params
      params.require(:user).permit(:name, ..., organization_types_attributes: [:id, :user_id, :org_type, '_destroy'])
  end

用户表单

<%= form_for(@user) do |f| %>
  ...
  <div class="field">
    <%= f.label :organization_type %><br>
    <%= f.fields_for :organization_type do |builder| %>
      <%= builder.select :org_type, options_for_select(OrganizationType::ORG_TYPES) %><br/>
    <% end %>
  </div>
<% end %>

1 个答案:

答案 0 :(得分:1)

您的嵌套表格应为:organization_types

<%= f.fields_for :organization_types do |builder| %>
  <%= builder.select :org_type, options_for_select(OrganizationType::ORG_TYPES) %><br/>
<% end %>

您发现表单未显示复数organization_types的原因是,如果用户还没有organization_types,则Rails不会在表单中呈现嵌套属性。我会查看nested forms第9.2节中非常有用的Rails指南。引用该源,该源使用has_many地址和accepts_nested_attributes_for地址的Person对象的示例:

  

当关联接受嵌套属性时,fields_for呈现它   为关联的每个元素阻止一次。特别是,如果一个   人没有地址也没什么。   一种常见的模式是控制器构建一个或多个空   子项,以便向用户显示至少一组字段。该   下面的示例将导致呈现2组地址字段   在新的人形式......

指南中的示例,适用于您的控制器:

def new   
  @user = User.new
  2.times { @user.organization_types.build}
end

看看是否有帮助...