0

OK、データモデルがあります

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スロットを選択した場合、それをparamsで渡し、day、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_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_manyhas_many :time_slots

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

更新:いくつかの落とし穴。

タイムスロットが選択されていない場合は、フォームが保存されていないように見える可能性がありますが、アプリケーションに関連付けられている古いタイムスロットは引き続き取得されます。これはtime_slot_ids、コントローラーにnoが渡されるためです。これを防ぐには、追加する必要があります

check_box_tag 'application[time_slot_ids][]', nil

ブロックの前にある#eachため、チェックボックスがチェックされていない場合は常に何かを送信します。

もう1つ変更したいのは、タイムスロットが選択されているかどうかをチェックする部分です。

f.object.time_slots.include?(slot)

タイムスロットが熱心にロードされていない場合、これは各タイムスロットのデータベースにヒットします。実行できることの1つは、現在のアプリケーションのtime_slot_idsを保持するインスタンス変数を追加し、それをブロック内のスロットと照合することです。

# controller
@time_slot_ids = @application.time_slot_ids

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