2

私のアプリケーションには、日時である開始属性と終了属性を持つモデル「予定」があります。別の日付と時刻のピッカーを使用できるように、日付と時刻の部分をフォームとは別に設定しようとしています。こうすればいいのにと思いました。私が読んだことから、レールは2つの部分を結合し、結合されたフィールドを通常のように日時として解析する必要があります

2 error(s) on assignment of multiparameter attributes [error on assignment ["2013-09-16", "15:30"] to start (Missing Parameter - start(3)),error on assignment ["2013-09-16", "16:30"] to end (Missing Parameter - end(3))]

リクエスト パラメータは次のとおりです。

{"utf8"=>"✓", "authenticity_token"=>"OtFaIqpHQFnnphmBmDAcannq5Q9GizwqvvwyJffG6Nk=", "appointment"=>{"patient_id"=>"1", "provider_id"=>"1", "start(1s)"=>"2013-09-16", "start(2s)"=>"15:30", "end(1s)"=>"2013-09-16", "end(2s)"=>"16:30", "status"=>"Confirmed"}, "commit"=>"Create Appointment", "action"=>"create", "controller"=>"appointments"}

私のモデル

class Appointment < ActiveRecord::Base
    belongs_to :patient
    belongs_to :practice
    belongs_to :provider
  validates_associated :patient, :practice, :provider


end

ビューの関連部分: (単純な形式)

      <%= f.input :"start(1s)", :as => :string, :input_html => { :class => 'date_time_picker' , :value => Date.parse(params[:start]) }%>
      <%= f.input :"start(2s)", :as => :string, :input_html => { :class => 'date_time_picker' , :value => Time.parse(params[:start]).strftime('%R') }%>

      <%= f.input :"end(1s)", :as => :string, :input_html => { :class => 'date_time_picker' , :value => Date.parse(params[:end]) }%>
      <%= f.input :"end(2s)", :as => :string, :input_html => { :class => 'date_time_picker' , :value => Time.parse(params[:end]).strftime('%R') }%>

更新:これが私のモデルの外観です。getter/setter メソッドを実行しようとしましたが、start-dat、start_time などがモデルで nil であり、パラメーターが送信されないため、スタックしています。

class Appointment < ActiveRecord::Base
    belongs_to :patient
    belongs_to :practice
    belongs_to :provider
    validates_associated :patient, :practice, :provider
    before_validation :make_start, :make_end


    ############ Getter Methods for start/end date/time
    def start_time
        return start.strftime("%X") if start
    end

    def end_time
        return self.end.strftime("%X") if self.end
    end

    def start_date
        return start.strftime("%x") if start
    end

    def end_date
        return self.end.strftime("%x") if self.end
    end


    def start_time=(time)
    end

    def end_time=(time)
    end

    def start_date=(date)
    end

    def end_date=(date)
    end


    def make_start
        if defined?(start_date)
            self.start = DateTime.parse( self.start_date + " " + self.start_time)
        end
    end

    def make_end
        if defined?(end_date)
            self.start = DateTime.parse( end_date + " " + end_time)
        end
    end
end
4

2 に答える 2

0

ruby on rails のマルチパラメータ属性が *本当に* 機能する方法 (datetime_select)を参照してください。

この質問によると、マルチパラメータ属性メソッドはオブジェクトでは機能しますが、オブジェクトでは機能しDateませんDateTime。a の場合、Date年、月、日を別々の値として渡すためMissing Parameter - start(3)、期待される 3 番目のパラメーターが存在しないためです。

DateTimeただし、インスタンス化には少なくとも 5 つのパラメータが必要でDateTime.new(2013, 09, 16, 15, 30)あるため、自動解析に頼ることはできません。最初にパラメーターを分割する必要があります。その場合、オブジェクトを保存する前に before_filter または同様のメソッドを使用して簡単に解析できます。

コンストラクターを参照してください: http://www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html#method-c-new

マルチパラメータの説明: http://apidock.com/rails/ActiveRecord/AttributeAssignment/assign_multiparameter_attributes

于 2013-09-17T07:47:08.923 に答える