0

同様の問題に対するいくつかの回答を確認しましたが、すべて問題がattr_accessibleであることを示唆しているようですが、これを機能させることができないようです。

基本的に、ユーザーと住所のモデルがあり、住所属性をネストされた属性として割り当てたいと考えています。しかし、保存すると、以下に示す属性を一括割り当てできないというエラーが発生します。

以下のコードでattr_accessibleの多くのバリエーションを試しました。たとえば、:addresses_attributes、:address_attributes、:primary_address_attributes ...おそらく、Memberモジュール宣言にあるために、機能しない理由がわかりません。

誰か助けてもらえますか?

class Member::User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :trackable, :validatable

  # each user may have zero or many addresses
  # their primary email is also set as their login id.
  has_many :addresses

  has_one :address, :class_name => "Member::Address", :conditions => "is_primary = true"
  accepts_nested_attributes_for :addresses, :address

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me,     :address_attributes

   validates_presence_of :email 

end

ネストされたフィールド(の関連部分)を送信する私のフォーム

  <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => {:class => "form-horizontal"}) do |f| %>
    <small>Mandatory fields marked *</small><br><br>
    <% devise_error_messages! %>
    <% flash.each do |name, msg| %>
      <div class="alert alert-<%= name == :notice ? "success" : "error" %>">
        <a class="close" data-dismiss="alert">×</a>
        <%= msg %>
      </div>
    <% end %>

    <%= f.fields_for resource.build_primary_address do |address_form| %> 
    <div class="control-group">
        <%= address_form.label :first_name, :class => "control-label" %>
        <div class="controls">
          <%= address_form.text_field :first_name, :class => "input-xlarge" %>
        </div>
      </div>

    <div class="control-group">
        <%= address_form.label :last_name, :class => "control-label" %>
        <div class="controls">
          <%= address_form.text_field :last_name, :class => "input-xlarge" %>
        </div>
      </div>
    <% end %>

エラーはこれを示しています:

 Can't mass-assign protected attributes: member_address

{"utf8"=>"✓",
 "authenticity_token"=>"HrZJG2krn15veUKJVh6PgEs4wwufaeRhciHcUIn6AaM=",
 "user"=>{"member_address"=>{"first_name"=>"asdf",
 "last_name"=>"asdfsafd"},
 "email"=>"Bob.JOnes@jones.com",
 "password"=>"[FILTERED]",
 "password_confirmation"=>"[FILTERED]"}}
4

2 に答える 2

1

フォームで送信されるプライマリアドレスがネストされた属性であることをレールが理解できるようにするには、ここで関係を明示的に指定する必要があります。

<%= f.fields_for :address, resource.build_primary_address do |address_form| %>

。その理由は、モデル名のスコープがMember::。であり、railsがクラス名からフォームパラメーター名を派生しているため、paramsハッシュでは:addressではなく:member_addressになってしまうためです。この場合の:addressは、:userがネストされた属性を受け入れるフィールドであるため、:addressはparamsハッシュで:address_attributesとして表される必要があります。したがって、後者がattr_accessibleに表示されることを確認してください。

于 2012-09-17T14:56:28.987 に答える
0

追加

attr_accessible :member_address

ユーザーモデルに。

説明:ActiveRecordインスタンスを初期化するすべてのハッシュキーは、attr_accessibleとして指定する必要があります。ハッシュキーを見ると、次のようになります。

 "user"=>{"member_address"=>{ ... }}

Userインスタンスを初期化するハッシュのmember_addressキー。したがって、attr_accessibleステートメントに含める必要があります。

于 2012-09-17T14:21:18.227 に答える