2011-12-26 39 views
0

我正在開發的應用程序涉及三件事情:報告,部分和作者。HABTM模型和動態表單

報告has_many部分和作家。部分和作者之間有HABTM的關係,因爲作者可以選擇寫幾個部分,而部分可以寫很多文章。

我有它顯示的方式是這樣的:

  • 報告
    • 第1
      • 作家1
      • 器2
    • 第2
      • 寫入器1
      • 器3
    • 第三節
      • 寫器4
      • 器2

我能做到這一點很容易地足以在索引中。我的問題是在view/writers/_form.html.erb中的表單。

當一個作家被創建時,我想把作者分配給1)一個項目和2)一個部分。

我其實大部分都使用複選框。

<%= f.label :report_id %><br /> 
<%= f.collection_select :report_id, Report.all, :id, :name %> 

<%= f.label "Section" %><br /> 
<% Section.order(:name).all.each do |section| %> 
    <%= check_box_tag "writer[section_ids][]", section.id, @writer.section_ids.include?(section.id) %> 
    <%= section.name %><br /> 
<% end %> 

但是,這給我的問題。這樣,顯示所有報告中的所有部分。我不想要這個。所以我把它改爲:

<% Section.order(:name).where(report_id:@writer.report_id).each do |section| %> 

但是這樣,當創建一個新的寫入器時,不會出現部分複選框。它只在編輯頁面出現,編輯器已經保存並且已經分配給他們的報告。

它是有道理的,爲什麼它這樣做,但有什麼辦法可以讓報告被選中後「分配」,所以適當的部分?

我試圖跟蹤Ryan Bates的Railcast在http://railscasts.com/episodes/88-dynamic-select-menus-revised,但他的作品有兩個collection_select領域,模型協會是不會互相一模一樣..

回答

0

所以,你想的複選框隨用戶更改報告而更改?這是你必須用javascript做的事情。服務器端不能做到這一點。

然而,您可以採取不同的方法並分兩步分配作者。首先分配報告。然後,由於您已經設置了report_id,下一步可以爲該報告生成正確的複選框,您可以設置這些部分。

+0

是的,我不知道足夠的JavaScript來完成一步。我最後只是在Show頁面上顯示部分表單(用戶在創建操作之後重定向到的),以便他們可以勾選複選框。不是我喜歡的,但現在足夠好。 – cdotfeli 2011-12-26 08:33:55