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

Cra*_*uff 10 ruby-on-rails devise

我有与使用Devise创建其他相关模型(没有答案)相同的问题.

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

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

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

的routes.rb

map.devise_for :users
map.resources :users, :has_many => :companies
Run Code Online (Sandbox Code Playgroud)

user.rb

has_many :companies
accepts_nested_attributes_for :companies
devise :registerable ... etc
Run Code Online (Sandbox Code Playgroud)

company.rb

belongs_to :user
Run Code Online (Sandbox Code Playgroud)

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 %>
...
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*sol 16

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

user.rb

def with_company
  self.companies.build
  self
end
Run Code Online (Sandbox Code Playgroud)

并修改视图:

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 %>
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么传入resource_name,下面不应该工作?<%form_for resource.with_company,... (3认同)
  • 您应该只构建一次,或者每次提交表单<line break>`self.companies.build if self.companies.empty? (2认同)
  • 对于使用此解决方案的任何人,@ meleyal和@GeorgeW都是正确的.但是,注意ActiveRecord延迟加载,使用`self.companies.build if self.companies(true).empty?`,否则`empty?`可能会返回true,即使它不应该. (2认同)

Pre*_*all 2

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