2

businesshas_oneのモデルがありaddress、ビジネスの作成時に住所属性を受け入れるフォームを作成しようとしています。エラーが発生します

保護された属性を一括割り当てできません:アドレス

これが私のモデルです

仕事

class Business<ActiveRecord::Base
  has_one :address, :as => :addressable
  attr_accessible :name, :email, :address_attributes, :password, :password_confirmation
  validates_presence_of :address
  validates_associated :address
  accepts_nested_attributes_for :address
end

住所

class Address<ActiveRecord::Base
  attr_accessible :line1, :city, :zip
  validates_presence_of :line1, :city, :zip

  belongs_to :addressable, polymorphic: true
end

意見

%h2 Sign up
= form_for(:business, :url => business_registration_path) do |f|
  = devise_error_messages!
  %div
    = f.label :name
    %br/
    = f.text_field :name
  %div
    = f.label :email
    %br/
    = f.email_field :email
  %div
    = f.label :password
    %br/
    = f.password_field :password
  %div
    = f.label :password_confirmation
    %br/
    = f.password_field :password_confirmation
  %div
    =f.fields_for :address do |address|
      =render :partial => 'businesses/shared/address', :locals => {:f => address}
  %div= f.submit "Sign up"
= render :partial => "devise/shared/links"

部分図

%div
  = f.label :line1, 'Address 1'
  %br/
  =f.text_field :line1
%div
  = f.label :city
  %br/
  = f.text_field :city
%div
  = f.label :zip, 'Postal Code'
  %br/
  = f.text_field :zip

生の投稿データこれは私が問題だと思うところです

Parameters: {"utf8"=>"✓", "authenticity_token"=>"/h17NgMDr4VCTDd+FxGlAI4RWmfAat9guU9q00hYIA4=", "business"=>{"name"=>"hello", "email"=>"hello@gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "address"=>{"line1"=>"this is line1",  "city"=>"Andra", "country"=>"Jama", "zip"=>"123123"}}, "commit"=>"Sign up"}

アドレスフィールドはこのようにすべきではありません

"address_attributes"=>{"line1"=>"this is line1",  "city"=>"Andra", "country"=>"Jama", "zip"=>"123123"}

address_attributesではなくaddressを生成するのはなぜですか?これが問題の原因である可能性があります。何か案は?私はこれに約2時間苦労しています。提案や解決策を高く評価しました。

Upadte1:

ビューを変更して使用する場合

 =f.fields_for :address_attributes do |address|

それ以外の

 =f.fields_for :address do |address|

すべてが機能し始めますが、これはすべてのチュートリアルとドキュメントが話していることではありませんか?

4

1 に答える 1

3

シンボルではなく、オブジェクト(Businessクラスのインスタンス)を渡す必要があります。form_for

= form_for(@business, :url => business_registration_path) do |f|

おそらく、あなたは@business = Business.newコントローラーアクションを持っているでしょう。

このBusinessクラスには、すべての検証および関連付けロジックが含まれています。モードレスフォームが必要な場合はシンボルを使用します(Railsは、同じ名前を共有している場合でも、クラスを:business参照しているとは推測しません)。Business

于 2012-05-22T12:21:15.137 に答える