10

我有与使用 Devise 创建附加相关模型相同的问题(没有答案)。

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

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

我有以下内容(缩短以使其可读):

路线.rb

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

用户.rb

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

公司.rb

belongs_to :user

新的.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 列表中。

4

3 回答 3

16

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

用户.rb

def with_company
  self.companies.build
  self
end

并修改视图:

新的.html.erb

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

这样,您将拥有嵌套表单以向用户添加一家公司。要为用户动态添加多个公司,请查看Ryan Bates 的 Railcast #197。确保您将这对资源作为数组传递,否则您将收到如下错误:“参数数量错误(3 代表 2)”。

于 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 回答