2013-12-11 62 views
1

我正在構建項目管理應用程序,我正在使用form_for創建項目,但在其中我想要一個fields for來創建3個學生。在一個字段中的多個文本字段

我建立了我的new.html.erb的項目是這樣的:

<h1>Creating new project</h1> 

<%= form_for :project, url: projects_path do |f| %> 
    <p> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    </p> 

    <p> 
    <%= f.label :lecturer %> 
    <%= f.text_field :lecturer %> 
    </p> 

    <p> 
     <%= f.fields_for :students do |s| %> 
      <%= s.label :name %> 
      <%= s.text_field :name %><br> 
      <%= s.label :name %> 
      <%= s.text_field :name %><br> 
      <%= s.label :name %> 
      <%= s.text_field :name %> 
     <% end %> 
    </p> 

    <p> 
    <%= f.submit %> 
    </p> 
<% end %> 

而對於jusst增加了一個簡單的網上看到我的form_for結果create方法:

def create 
    render text: params[:project].inspect 
    end 

所以,當我填寫在頁面上的文本字段,並提交我得到的所有是{"name"=>"asd", "lecturer"=>"ffff", "students"=>{"name"=>"qeew"}},因爲你只能看到我的最後一個學生被傳遞給這本字典。

如何在一個fields_for中創建多個學生?或者我如何設置這兩個模型來相互配合。我希望你明白我的觀點並知道我想達到什麼目的。

回答

2

你可以建立你需要有場在您的控制器new行動的學生人數一樣如下:

# app/controllers/projects_controller.rb 

def new 
    @project = Project.new 
    3.times do 
    student = @project.students.build 
    end 
end 

這將建立在項目實例三個學生。

# app/views/projects/new.html.erb 

<%= form_for @project, url: projects_path do |f| %> 
    <p> 
    <%= f.label :name %> 
    <%= f.text_field :name %> 
    </p> 
    <p> 
    <%= f.label :lecturer %> 
    <%= f.text_field :lecturer %> 
    </p> 
    <p> 
    <%= f.fields_for :students do |s| %> 
     <%= s.label :name %> 
     <%= s.text_field :name %> 
    <% end %> 
    </p> 
    <p> 
    <%= f.submit %> 
    </p> 
<% end %> 
+0

@rohit,感謝您的編輯。 – vee

+0

沒問題。我通過手機編輯它,所以語法突出顯示沒有正確設置。我看到你再次編輯它:-) – Rohit

1

大概最容易做的事情是在一個適當的Project對象傳遞,而不是初始化它關閉的象徵,:

然後按以下步驟更新您的視圖的form_for聲明。然後,將三名學生添加到對象中,併爲整個集合創建一個字段。

要做到這一點,你會希望在projects#new像這樣的代碼 - 在

@project = Project.new 
3.times { @project << Student.new } 

然後形式:

form_for @project do |f| 
    ... 
    f.fields_for :students do |s| 
    s.label :name 
    s.text_field :name 
    end 
end 

fields_for將自動爲每個學生不同的字段您添加到控制器中的項目。


有一點我不能完全肯定:我覺得需要你在Project模型添加一行accepts_nested_attibutes_for :students,但我不是很確定。這確實具有額外的優點,您可以在控制器的創建操作中輕鬆創建學生和項目,但在任何情況下都不是正確的選擇。如果我的解決方案確實需要accepted_nested_attributes_for而您不需要,請告訴我,我可以用類似的更痛苦的解決方案更新我的答案。

相關問題