如何在设计模型中使用嵌套属性

时间:2010-08-23 01:52:18

标签: ruby-on-rails devise

我遇到与Creating an additional related model with Devise相同的问题(没有答案)。

我已经覆盖了创建新用户的设计视图并添加了公司名称,我已将模型更改为使用accepts_nested_attributes_for

没有错误,但没有添加嵌套记录,我没有可以修改请求的控制器。

我有以下内容(缩写为可读):

的routes.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 %>
...

更新: 我没有添加:company到User模型中的attr_accessible列表。

3 个答案:

答案 0 :(得分:16)

您可以将以下方法添加到用户模型:

<强> 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 %>

这样,您就可以使用嵌套表单向用户添加一个公司。 要向用户动态添加多个公司,请查看Railcast #197 by Ryan Bates。 确保你将这对资源作为数组传递,在其他地方你会收到如下错误:“错误的参数数量(3个用于2)”。

答案 1 :(得分:2)

您可能尝试批量分配某些受保护变量,或者您可能没有保存有效记录。检查以确保记录实际保存到数据库。

答案 2 :(得分: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经验,但我认为这是一个更好的解决方案。你怎么看?