7

かなり長い間検索しましたが、解決策が見つかりませんでした。ここに私のモデルがあります:

web.rb

class Web < ActiveRecord::Base
   devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :user_type, :remember_me

  belongs_to :role, :polymorphic => true
end

user.rb

class User < ActiveRecord::Base
 has_one :web, :as => :role
 attr_accessible :dob, :fname, :lname
end

org.rb

class Org < ActiveRecord::Base
  has_one :web, :as => :role
  attr_accessible :name, :website
end

devise/registration/new.html.erb で通常の form_for の代わりに simple_form_for を使用するまで、すべて問題ないようです。

<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :class => 'form-horizontal' }) do |f| %>

  <%= f.input :email, label: false, :input_html => { :class => "span6", placeholder: "Email", type: "email", required: true}%>

  <%= f.input :password, label: false, :input_html => { :class => "span6", placeholder: "Password", type: "password" }%>

  <%= f.input :password_confirmation, label: false, :input_html => { :class => "span6", placeholder: "Re-enter Password", type: "password" }%>

  <%= f.input :user_type, as: :hidden, :input_html => { :value => user_type} %>

  <%= f.simple_fields_for resource.role do |rf| %>
    <%= render :partial => "#{child_class_name.underscore}_fields", :locals => { :f => rf } %>
  <% end %>
  <%= f.submit "Sign up" %>
<% end %>

ネスト部分は、対応するフィールドを含む適切な model_fields 名を持つパーシャルを配置します。

*_org_fields.html.erb*

<%= f.text_field :name, :class=>"span6", :type=>"text", :placeholder=>"Name", :required=>"" %><br />
<%= f.text_field :website, :class=>"span6", :type=>"text", :placeholder=>"Website", :required=>"" %>

問題は f.simple_fields_for にあります。simple_ を削除すると、すべて正常に動作します。しかし、私はそれを削除したくありません。私が遭遇するエラーは次のとおりです。

 ActiveModel::MassAssignmentSecurity::Error in Devise::RegistrationsController#create

 Can't mass-assign protected attributes: org

リクエスト パラメータは次のとおりです。

{"utf8"=>"✓",
 "authenticity_token"=>"NnsyNdrrKJmd8QutqVs6HqZi0EnQmAmZF7zGYqnu+rI=",
 "web"=>{"email"=>"",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]",
 "user_type"=>"org",
 "org"=>{"name"=>"",
 "website"=>""}},
 "commit"=>"Sign up"}

助けてください。

4

1 に答える 1

1

Web、次を追加します。

attr_accessible :role_attributes
accepts_nested_attributes_for :role

編集:元々はそれを持っていましUserたが、DeviseリソースはWeb.

Edit2: を逃したas: :role。attr 値を反映するように変更しました。

于 2013-07-27T18:34:27.460 に答える