2013-03-30 103 views
0

希望我的連續問題對任何人都不是問題,我想要求您提供如何從兩個模型中創建兩個模型的幫助一種形式。從「belongs_to」形式創建兩個相關模型(導軌)

兩個相關的模型

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 

這是員工和公司之間的某種關聯(emp loyee「持有」公司id),但它不會創造(或者,如果我理解得好,實際上並不存儲)公司。

如果我繼續在id分配前添加@company.save,那麼一切似乎都沒問題。不過呢?我不應該渲染new company form並在提交之後保存所有內容嗎?

我一直在尋找解決方案,但在每一種情況下,執行都是以相反的方式進行:如何從一個新的公司形式創建一羣員工。

+0

你不能把一個表單的表單裏面,所以我開始重新思考來的呈現輸入只使用一個simple_form_for – RadBrad

+0

「你不能」,因爲「這不是最佳實踐」?因爲這些字段實際上是顯示的,並且屬性也可以很好地發送。 – sebkkom

+0

我認爲這比W3C XHTML規範特別禁止的「不是最佳做法」更嚴厲。它以細微的方式打破瀏覽器,很難探測到方式! – RadBrad

回答

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模型的所有屬性加滿,跟着this

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 
+0

'員工'模型沒有':title'屬性,所以上面的表單給出了一個'未定義的'Employee'標題'。 – sebkkom

+0

您的評論尚不清楚,我發佈了一個修復程序來演示如何將simple_form_for僞裝成模型中不存在的屬性 – RadBrad

+0

在Employee模型中添加了'def title'方法之前,我已評論過'。儘管這種方法看起來像對未經驗的我「作弊」,但它總是有意義的。非常感謝 - 我會盡快接受測試。 – sebkkom

相關問題