3

私は Mongoid を使用するのは初めてですが、ActiveRecord についてはかなりの経験があります。私は次のモデルを持っています

def Company
  field :name

  has_one :owner, autosave: true, class_name: 'User', inverse_of: :company
  accepts_nested_attributes_for :owner
end

def User
  belongs_to :company, inverse_of: :owner
  has_one :profile
end

私のRegistrationControllerには次のメソッドがあります

def new 
  @company = Company.new
  @company.build_owner
  @company.owner.build_profile
  respond_with @company
end 

そして私の見解では...

= simple_form_for @company, url: user_registration_path do |f| 
  = f.error_notification
  .inputs
    = f.simple_fields_for @company.owner do |o| 
      = o.input :email, required: true, autofocus: true
      = o.simple_fields_for @company.owner.profile do |p| 
        = p.input :first_name, required: true
        = p.input :last_name, required: true
      = f.input :name, label: 'Company Name'
      = f.input :subdomain
      = o.input :password, required: true
      = o.input :password_confirmation, required: true
  .actions
    = f.button :submit, "Sign up"

このフォームを送信するたびに、次のようなパラメーターが返されます。

{"utf8"=>"✓",
 "authenticity_token"=>"6z8+evYUwZwx3iADFewsMHiPl00vT7Eq6WaD8BOnQBc=",
 "company"=>
  {"user"=>
    {"email"=>"testing@testing.com",
     "profile"=>{"first_name"=>"testing", "last_name"=>"testing"},
     "password"=>"testing",
     "password_confirmation"=>"testing"},
   "name"=>"testing",
   "subdomain"=>"testing"},
 "commit"=>"Sign up",
 "action"=>"create",
 "controller"=>"users/registrations"}

まず、ユーザー属性のキーが :user である理由がわかりません。:user_attributes または :owner_attributes ではないでしょうか? mongoid Web サイトの例は、それを示唆しているようです。次に、 company = Company.new(params[:company]) を実行し、そのオブジェクトに対して company.owner を実行すると、nil オブジェクトが取得されます。ただし、company.user を実行すると、正しいユーザー オブジェクトが返されます。params のキーが :owner (:user ではなく) である場合、関連付けは正常に機能するはずです。しかし、それはデフォルトでは起こりません。多分それはsimpleformと関係がありますか?どんな助けでも大歓迎です!

4

1 に答える 1

0

ownerモデル内のフィールドの名前であるため、フィールドを呼び出す必要があります。

これを呼び出すとuser、mongoidがモデルに動的フィールドを作成します- company[user]。これは正しい動作であり、正しく使用すると非常に強力なツールになります。

わかりませんsimple_formが、標準のレールでこれを行う方法は、を呼び出すf.fields_for :ownerことです。これにより、期待する機能が得られるはずです。

于 2012-06-22T08:48:56.620 に答える