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)