Как да обработвам квадратчетата за отметка в 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 за всеки timeslot. той ще използва метода 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 в модела на приложението (ако е необходимо). - person manoj; 24.02.2013