Как обрабатывать флажки в rails has_many?

Итак, у меня есть модель данных

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)})"

person Matt Elhotiby    schedule 24.02.2013    source источник


Ответы (1)


вы можете добавить check_box_tag внутри блока time_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)})"

это добавит check_box для каждого временного интервала. он будет использовать метод time_slot_ids, предоставленный has_many, когда вы добавите has_many :time_slots в модель приложения.

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

ОБНОВЛЕНИЕ: некоторые ошибки.

когда временной интервал не выбран, вы, вероятно, увидите, что форма не сохраняется, вы все равно получаете старые временные интервалы, связанные с приложением. Это связано с тем, что контроллеру не передается time_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)
person jvnill    schedule 24.02.2013
comment
А time_slot_ids следует добавить в список attr_accessible в модели Application (при необходимости). - person manoj; 24.02.2013