Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何处理rails中的复选框?_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 3.2_Form For - Fatal编程技术网

Ruby on rails 如何处理rails中的复选框?

Ruby on rails 如何处理rails中的复选框?,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.2,form-for,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.2,Form For,好的,我有一个数据模型 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 < ActiveReco

好的,我有一个数据模型

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

您可以在
时隙
块内添加
复选框标签

- 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)})"
这将为每个时隙添加一个复选框。当您向应用程序模型添加一个
has\u many:time\u slot
时,它将使用
time\u slot\u id
方法,该方法由
has\u many
提供

# application.rb
has_many :schedules
has_many :time_slots, through: :schedules
更新:一些陷阱

如果没有选择任何时隙,您可能会看到表单似乎没有保存,您仍然会得到与应用程序关联的旧时隙。这是因为没有
时间槽ID
传递给控制器。要防止这种情况,您需要添加

check_box_tag 'application[time_slot_ids][]', nil
#每个
块之前,因此它总是在未选中复选框时发送内容

您还需要更改的一件事是检查是否选择了时隙的部分

f.object.time_slots.include?(slot)
如果未加载每个时隙,这将影响每个时隙的数据库。您可以做的一件事是添加一个实例变量,该变量保存当前应用程序的时间槽ID,并对照块中的槽进行检查

# controller
@time_slot_ids = @application.time_slot_ids

# view
@time_slot_ids.include?(slot.id)

时间槽ID应添加到应用程序模型中的attr\u可访问列表中(如有必要)。
# controller
@time_slot_ids = @application.time_slot_ids

# view
@time_slot_ids.include?(slot.id)