0

(データベースに保存されている) 属性を作成するために、フォームからstart_datestart hour、およびstart_minute仮想属性を結合しようとしています。Eventstart_datetime

私は(STIを介して)いくつかのサブクラスを持っていEventます; TrainingSessionそれらを andWorkSessionと と呼びましょうPersonalTime

クラスは次のように構成されています。

class Event < ActiveRecord::Base
  ...
end

class TrainingSession < Event
  ...
end

class WorkSession < Event
  ...
end

class PersonalTime < Event
  ...
end

の関連部分event.rb:

class Event < ActiveRecord::Base
  attr_accessor :start_date, :start_hour, :start_minute

  validates :start_datetime, :presence => true

  before_validation :merge_attributes_for_datetime_string

  def merge_attributes_for_datetime_string
    start_datetime_string = "#{ start_date } #{ start_hour }:#{ start_minute }:00"
  end

  def start_datetime=(start_datetime_string)
    self.start_datetime = start_datetime_string
  end

  def start_date
    start_datetime.strftime("%d") if start_datetime?
  end

  def start_hour
    start_datetime.strftime("%H") if start_datetime?
  end

  def start_minute
    start_datetime.strftime("%M") if start_datetime?
  end
end

... とevents_controller.rb:

  def create
    @event = Event.new(event_params)
    if @event.save
      redirect_to :root, :flash => { :success => "Event added." }
    else
      redirect_to :back, :flash => { :notice => "There was an error creating the event." }
    end
  end

  private

  def event_params
    params.require(:event).permit(
      :type,
      :start_datetime,
      :start_date,
      :start_hour,
      :start_minute,
      ...
    )
  end

  def training_session_params
    params.require(:training_session).permit(
      ...
    )
  end

  def work_session_params
    params.require(:work_session).permit(
      ...
    )
  end

  def personal_time_params
    params.require(:personal_time).permit(
      ...
    )
  end

サーバー ログで、正しいパラメーターがフォームから送信されていることを確認しました。

Parameters: {"utf8"=>"✓", "authenticity_token"=>"<TOKEN HERE>=", "event"=>{"start_date" => "2013-08-23", "start_hour"=>"15", "start_minute"=>"00", "type"=>"PersonalTime"}, "commit"=>"Add Personal Time"}

しかし、(任意のタイプの) イベントを作成しようとするたびに、There was an error creating the event.(create メソッドに従って) 通知を受け取ります。をコメントアウトするvalidates :start_datetimeと、イベントが作成されますがstart_datetimenil.

これは、start_datetime文字列が仮想属性から適切にマージされていないことを意味する必要がありますが、その理由はわかりません.

ここで何が欠けていますか?設定するより良い方法はありstart_datetimeますか?

4

1 に答える 1

0

あなたが投稿した内容に基づいて、メソッドを呼び出している場所がわかりませんstart_datetime

start_datetime新しいメソッドを定義する代わりに、次のようにメソッドでマージを行うことができます。

before_validation :merge_attributes_for_datetime_string

def merge_attributes_for_datetime_string
  self.start_datetime = "#{ start_date } #{ start_hour }:#{ start_minute }:00"
end
于 2013-08-23T21:08:25.677 に答える