0

私はデバイスを使用してユーザーを認証しています。新しいユーザーがサインアップするときに、新しいアカウントも作成し、このユーザーをアカウントの所有者として設定したいと考えています。これには、ネストされたモデルのフォームを使用することにしました。これは私のセットアップです:

モデル:

class User < ActiveRecord::Base
  belongs_to :account
  has_one :owned_account, :class=> Account, :foreign_key => :owner_id
  accepts_nested_attributes_for :owned_account
end

class Account < ActiveRecord::Base
  has_many :users
  belongs_to :owner, :class => User, :foreign_key => :owner_id
end

ルート:

devise_for :users, :path_prefix => 'authentication', :controllers => {:registrations => "registrations"}
resources :accounts

オーバーライドされたデバイス登録コントローラー:

class RegistrationsController < Devise::RegistrationsController
   def new
     super
     owned_account = resource.build_owned_account
   end

   def create
     super
   end
end

形:

<%= simple_form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= f.error_notification %>

  <div class="form-inputs">
    <%= f.input :email, :required => true, :autofocus => true %>
    <%= f.input :password, :required => true %>
    <%= f.input :password_confirmation, :required => true %>

    <%= f.simple_fields_for :owned_account do |account| %>
      <%= account.input :name, :required => true %>
    <% end %>
  </div>

  <div class="form-actions">
    <%= f.button :submit, "Sign up" %>
  </div>
<% end %>

sign_up パスにアクセスしても例外はスローされませんが、フォームのネストされた部分は生成されません。すでに同様の質問がいくつかありますが、提供された解決策は私にはうまくいかないようです...

4

2 に答える 2

0

問題はsuper、オーバーライドされたコントローラーでの使用にありました。このコードは機能します:

class RegistrationsController < Devise::RegistrationsController
   def new
      resource = build_resource({})
      resource.build_owned_account
      respond_with resource
   end

   def create
     super
   end
end
于 2013-04-23T12:54:33.233 に答える
0

あなたのコードによると:

def new
  super
  owned_account = resource.build_owned_account 
end

ビューで変数owned_account にアクセスできません。その行を次のように置き換えてみてください:

resource.owned_account = resource.build_owned_account
于 2013-04-23T12:36:37.827 に答える