0

好的,所以我有数据模型

class Application < ActiveRecord::Base
  has_many :schedules

class Schedule < ActiveRecord::Base
 belongs_to :application
 belongs_to :time_slot
 attr_accessible :time_slot_id, :application_id, :day


class TimeSlot < ActiveRecord::Base
  attr_accessible :end_time, :friday, :name, :saturday, :start_time, :sunday, :thursday, :tuesday, :wednesday

基本上,当有人填写应用程序时,我有一个日历视图,提示他们选择哪一天的时间段...例如,我将列出星期二的 4 个时间段,而用户可以不选择所有时间段。

我的问题是:有没有办法为每个时隙创建复选框。因此,如果用户为星期三选择 4 个插槽,为星期五选择 3 个插槽,我可以将其与参数一起传递,并使用日期、time_slot_id 和 application_id 创建一个新的计划记录。

这是我到目前为止所拥有的,我显示了时间段,但不确定如何创建创建新记录的复选框

= form_for(@application) do |f|

  %tr
    - ['friday', 'saturday', 'sunday'].each do |day|
      %td
        - time_slots(day).each do |slot|
          %p{:style => "font-size: 12px;"}= "#{slot.name} (#{custom_time(slot.start_time)} - #{custom_time(slot.end_time)})"
4

1 回答 1

1

您可以check_box_tagtime_slots块内添加一个

- time_slots(day).each do |slot|
  = check_box_tag 'application[time_slot_ids][]', slot.id, f.object.time_slots.include?(slot)
  %p{:style => "font-size: 12px;"}= "#{slot.name} (#{custom_time(slot.start_time)} - #{custom_time(slot.end_time)})"

这将为每个时间段添加一个复选框。它将使用您添加到应用程序模型时time_slot_ids提供的方法。has_manyhas_many :time_slots

# application.rb
has_many :schedules
has_many :time_slots, through: :schedules

更新:一些陷阱。

当没有选择时间段时,您可能会看到表单似乎没有保存,您仍然会获得与应用程序关联的旧时间段。这是因为 notime_slot_ids被传递给控制器​​。为了防止这种情况,您需要添加

check_box_tag 'application[time_slot_ids][]', nil

#each块之前,所以当没有选中复选框时它总是发送一些东西。

您要更改的另一件事是检查是否选择了时间段的部分。

f.object.time_slots.include?(slot)

如果时间段没有急切加载,这将命中每个时间段的数据库。您可以做的一件事是添加一个实例变量来保存当前应用程序的 time_slot_ids 并根据块中的插槽检查它

# controller
@time_slot_ids = @application.time_slot_ids

# view
@time_slot_ids.include?(slot.id)
于 2013-02-24T05:12:44.470 回答