10

Deviseで追加の関連モデルを作成するのと同じ問題があります(答えはありません)。

新しいユーザーを作成するためのデバイス ビューをオーバーライドし、会社名を追加しました。モデルをaccepts_nested_attributes_forを使用するように変更しました

エラーはありませんが、ネストされたレコードが追加されておらず、リクエストを変更できるコントローラーがありません。

私は以下を持っています(読みやすくするために短縮されています):

ルート.rb

map.devise_for :users
map.resources :users, :has_many => :companies

user.rb

has_many :companies
accepts_nested_attributes_for :companies
devise :registerable ... etc

company.rb

belongs_to :user

new.html.erb

...
<% form_for resource_name, resource, :url => registration_path(resource_name) do |f| %>
...
  <% f.fields_for :company do |company_form| %>
    <p><%= company_form.label :name %></p>
    <p><%= company_form.text_field :name %></p>
  <% end %>
...

更新: User モデルの attr_accessible リストに :company を追加しませんでした。

4

3 に答える 3

16

次のメソッドを User モデルに追加できます。

user.rb

def with_company
  self.companies.build
  self
end

ビューを変更します。

new.html.erb

...
<% form_for [resource_name, resource.with_company], :url => registration_path(resource_name) do |f| %>
...
  <% f.fields_for :company do |company_form| %>
  ...
  <% end %>

このようにして、 1 つの会社をユーザーに追加するためのネストされたフォームが作成されます。ユーザーに複数の会社を動的に追加するには、Railcast #197 by Ryan Batesを確認してください。リソースのペアを配列として渡していることを確認してください。そうしないと、「引数の数が間違っています (2 に対して 3)」のようなエラーが発生します。

于 2010-09-21T21:59:20.607 に答える
2

保護された変数を一括割り当てしようとしている可能性があります。または、有効なレコードを保存していない可能性があります。レコードが実際にデータベースに保存されていることを確認してください。

于 2010-08-23T06:55:44.947 に答える
0

これは非常に古いスレッドであることに気付きましたが、より良い解決策を見つけたので返信します。

new.html.erb を次のように変更するだけです。

<% form_for(resource, :as => resource_name,:url => registration_path(resource_name) do |f| %>
    ...
    <% prefix = "user[company_attributes]"%>
    <% fields_for prefix, @user.company do |company_form| %>
    ...
    <% end %>
<% end %>

このように @user.save が呼び出されると、company.save も実行され、会社モデルにある可能性のあるすべての検証が行われます。

RoR の経験はあまりありませんが、これはより良い解決策だと思います。どう思いますか?

于 2011-12-07T15:51:52.320 に答える