HABTM模型和动态表格

时间:2011-12-26 03:24:29

标签: jquery ruby-on-rails

我正在开发的应用程序涉及三件事:报表,章节和作家。

报告has_many章节和作家。 Sections和Writers之间有HABTM关系,因为作者可以选择写几个部分,并且一个部分可以由许多文章编写。

我显示它的方式是:

  • 报告
    • 第1节
      • 作家1
      • 作家2
    • 第2节
      • 作家1
      • 作家3
    • 第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| %>

但是这样,在创建新编写器时不会出现任何部分复选框。只有在编写器保存并且已经为其分配了报告后,它才会出现在编辑页面中。

它为什么会这样做是有道理的,但是我有什么方法可以做到这一点,以便报告在被选中后被“分配”,那么适当的部分呢?

我正试图在http://railscasts.com/episodes/88-dynamic-select-menus-revised跟踪Ryan Bates的Railcast,但是他使用了两个collection_select字段,模型关联彼此并不完全相同..

1 个答案:

答案 0 :(得分:0)

因此,您希望在用户更改报告时更改复选框?这是你将需要用javascript做的事情。服务器端无法实现这一点。

然而,您可以采用不同的方法并分两步分配编写器。首先分配报告。然后,由于您已设置report_id,因此下一步可以为该报告生成正确的复选框,您可以设置这些部分。