Create both associated models from the form of the “belongs_to” one (rails)

▼魔方 西西 提交于 2019-12-23 04:39:15

问题


With the hope that my consecutive questions are not a problem for anyone, I want to ask for your assistance on how to achieve the creation of two models from one form.

The two associated models are

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

and what I want is to create a company when I am creating an employee and the input company doesn't already exist. Without the "when the company doesn't already exist" requirement, this is my code:

employees/_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 %>

and employees_controller.rb

def new
  @employee = Employee.new
  @company = Company.new
end

[...]

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

  respond_to do |format|
    if @employee.save
      format.html { redirect_to @employee, notice: 'Employee was successfully created.' }
      format.json { render json: @employee, status: :created, location: @employee }
    else
      format.html { render action: "new" }
      format.json { render json: @employee.errors, status: :unprocessable_entity }
    end
  end
end

This some kind of association between the employee and the company (that of the employee "holding" the company id) but it doesn't create (or, if I understand well, doesn't actually save) the company.

If I go on and add @company.save before the id assignment, everything seems okay. Is it, however? Shouldn't I render the new company form and have everything saved after that is submitted?

I have been searching online all day for the solution but in every case the implementation was performed the opposite way: How to create a bunch of employees from a new company form.


回答1:


Okay, after a lot of experimenting, I 've came down to this:

employees/_form.html.erb

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

employees_controller.rb

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

It is slightly more elegant than the answer provided by @RadBrad but also influenced by it.

if you need to know how to actually fill in all the attributes of the company model, follow this




回答2:


There are lot's of ways to go, here is one:

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

Then in your EmployeesController:

def create
   co = Company.find_by_title(params[:employee][:title]).first
   unless co
      co = Company.new({:company=>params[:employee][:title]})
   end
   co.employees.build({:name=>params[:employee][:name]});
   co.save
end


来源:https://stackoverflow.com/questions/15721701/create-both-associated-models-from-the-form-of-the-belongs-to-one-rails

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!