0

私の連続した質問が誰にとっても問題ではないことを願って、1 つのフォームから 2 つのモデルを作成する方法を教えてください。

関連する 2 つのモデルは次のとおりです。

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

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

これは、従業員と会社の間のある種の関連付け (従業員が会社 ID を「保持」すること) ですが、会社を作成しません (または、私がよく理解している場合は、実際には保存しません)。

id の割り当ての前に追加すると@company.save、すべて問題ないように見えます。しかし、そうですか?をレンダリングして、new company form送信後にすべてを保存するべきではありませんか?

私は一日中オンラインで解決策を探していましたが、いずれの場合も実装は逆の方法で行われました。新しい会社形態から多数の従業員を作成する方法です。

4

2 に答える 2

3

さて、多くの実験の後、私はこれに行き着きました:

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

@RadBrad が提供する回答よりもわずかにエレガントですが、その影響も受けています。

モデルのすべての属性を実際に入力する方法を知る必要がある場合は、これcompanyに従ってください

于 2013-04-08T20:26:00.950 に答える
1

方法はたくさんありますが、次の方法があります。

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

次に、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
于 2013-03-30T18:32:21.737 に答える