Ruby on rails 以“创建”的形式创建两个关联模型;属于;一个(轨道)

Ruby on rails 以“创建”的形式创建两个关联模型;属于;一个(轨道),ruby-on-rails,forms,rails-activerecord,Ruby On Rails,Forms,Rails Activerecord,希望我连续提出的问题不会对任何人造成问题,我想请您帮助我如何从一种形式创建两个模型 这两个相关模型是 class Employee < ActiveRecord::Base attr_accessible :name belongs_to :company attr_accessible :company_id end class Company < ActiveRecord::Base attr_accessible :name has_many :emp

希望我连续提出的问题不会对任何人造成问题,我想请您帮助我如何从一种形式创建两个模型

这两个相关模型是

class Employee < ActiveRecord::Base
  attr_accessible :name

  belongs_to :company
  attr_accessible :company_id
end

class Company < ActiveRecord::Base
  attr_accessible :name

  has_many :employees
end
employees\u controller.rb

def new
  @employee = Employee.new
  @company = Company.new
end
def create
  @employee = Employee.new(params[:employee])

  @company = Customer.find_or_create_by_name(params[:company][:name])
  @company.employees << @employee
  @company.save

  @employee.save
end
[……]

这是员工和公司(持有公司id的员工)之间的某种关联,但它不会创建(或者,如果我理解得很好的话,实际上不会拯救)公司

如果我继续在id分配之前添加
@company.save
,一切似乎都正常。然而,是吗?我是否应该提交
新公司表格
,并在提交后保存所有内容


我整天都在网上搜索解决方案,但每次都是以相反的方式实施:如何从新的公司形式创建一批员工。

还有很多方法要走,这里有一个:

def Employee << ActiveRecord::Base
  def title
    return nil
  end
end

<%= simple_form_for(@employee) do |f| %>
  <%= f.input :name, label: 'Employee Name', :required => true %>
  <%= f.input :title, label: 'Company Name', :required => true %>
  <%= f.submit 'Create'
<% end %>

有很多路要走,这里有一条:

def Employee << ActiveRecord::Base
  def title
    return nil
  end
end

<%= simple_form_for(@employee) do |f| %>
  <%= f.input :name, label: 'Employee Name', :required => true %>
  <%= f.input :title, label: 'Company Name', :required => true %>
  <%= f.submit 'Create'
<% end %>

好的,经过大量的实验,我得出以下结论:

employees/\u form.html.erb

<%= simple_form_for(@employee) do |f| %>
  <%= simple_form_for(@company) do |cf| %>
    <%= f.input :name, label: 'Employee Name', :required => true %>
    <%= cf.input :title, label: 'Company Name', :required => true %>
  <% end %>
<% end %>
<%= simple_form_for(@employee) do |f| %>
  <%= simple_fields_for(@company) do |cf| %>
    <%= f.input :name, label: 'Employee Name', :required => true %>
    <%= cf.input :title, label: 'Company Name', :required => true %>
  <% end %>
<% end %>
它比@RadBrad提供的答案稍微优雅一些,但也受到它的影响


如果您需要知道如何实际填写
公司
模型的所有属性,请遵循

好的,经过大量实验,我得出以下结论:

employees/\u form.html.erb

<%= simple_form_for(@employee) do |f| %>
  <%= simple_form_for(@company) do |cf| %>
    <%= f.input :name, label: 'Employee Name', :required => true %>
    <%= cf.input :title, label: 'Company Name', :required => true %>
  <% end %>
<% end %>
<%= simple_form_for(@employee) do |f| %>
  <%= simple_fields_for(@company) do |cf| %>
    <%= f.input :name, label: 'Employee Name', :required => true %>
    <%= cf.input :title, label: 'Company Name', :required => true %>
  <% end %>
<% end %>
它比@RadBrad提供的答案稍微优雅一些,但也受到它的影响


如果您需要知道如何实际填写
公司
模型的所有属性,请遵循

您不能将表单放入表单中,因此我将开始重新考虑仅使用一个简单的表单来表示“您不能”,如“这不是最佳实践”中的“您不能”?因为字段实际上是显示的,属性也发送得很好。我认为这比“非最佳实践”更严重,W3C XHTML官方规范明确不允许这样做。它以微妙而难以察觉的方式打破了浏览器!谢谢你的通知,我的坏习惯是“盲目”遵循别人的代码。为了记录在案,我将内部表单更改为“simple\u fields\u For”。(问题更新)我发布了一个答案,刷新它,因为第一个版本有一个bug!你不能把一个表单放在一个表单中,所以我会开始重新考虑输入的表示,只使用一个简单的表单来表示“你不能”,就像在“这不是最佳实践”中一样?因为字段实际上是显示的,属性也发送得很好。我认为这比“非最佳实践”更严重,W3C XHTML官方规范明确不允许这样做。它以微妙而难以察觉的方式打破了浏览器!谢谢你的通知,我的坏习惯是“盲目”遵循别人的代码。为了记录在案,我将内部表单更改为“simple\u fields\u For”。(问题更新)我发布了一个答案,刷新它,因为第一个版本有一个bug!
employee
模型没有
:title
属性,因此上面的表单为employee提供了一个
未定义的方法“title”。您的注释不清楚,我发布了一个补丁,展示了如何伪造simple_form_,以设置模型中不存在的属性。在您将
def title
方法添加到
员工模型中之前,我发表了评论。虽然这种方法在我这个没有经验的人看来像是“作弊”,但它完全有道理。非常感谢-我一测试它就会接受。
employee
模型没有
:title
属性,因此上面的表单为employee
提供了一个
未定义的方法“title”。您的评论不清楚,我发布了一个补丁,展示了如何伪造simple_form_,以设置模型中不存在的属性。在您将
def title
方法添加到
员工模型中之前,我发表了评论。虽然这种方法在我这个没有经验的人看来像是“作弊”,但它完全有道理。非常感谢-我一测试就接受。