2016-09-16 67 views
2

我遇到这种奇怪的行为与嵌套params。 当我尝试保存表单,它说Unpermitted parameter: organization_type奇怪的行为与嵌套params

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

我试图在窗体和控制器白名单中具有属性作为organization_type(单数),但这不起作用。

但是,在表格中,如果我有:organization_types该字段不会显示出来。

我真的很困惑这一点。

所以,作为一个快速回顾:

  • 我没有为OrganizationType
  • 控制器在表单中我有::organization_type。如果我以复数它不显示
  • 在控制器白名单上有::organization_types_attributes
  • 用户模型中我有:HAS_MANY和accepts_nested为:organization_types_attributes

用户模型

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 

User Co ntroller

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

应该: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指南。引用该源,它使用一个Person对象的例子has_many地址和accepts_nested_attributes_for地址:

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

例子:

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

看看是否有帮助?

+0

我改变了我的模型HAS_ONE ......并按照所提到的文件@Ren和现在它似乎在工作。我注意到的两件事是。 1.我的选择帮手没有显示上次保存的内容。我试过这个'<%​​= builder.select:org_type,options_for_select(OrganizationType :: ORG_TYPES,:selected => @ user.organization_type.org_type)%>' - 2.而不是更新记录,而是创建一个新记录 – Marrento