Parameter Reihenfolge in Foo.neu (Parameter [: foo]), brauche eins vor dem anderen (Schienen)
-
23-09-2019 - |
Frage
Ich habe ein Problem, das ich nicht beheben kann.Es hat mit dem unsortierten Parameter-Hash zu tun.
Ich habe eine Objektreservierung mit einem virtuellen Attribut time = und einem virtuellen Attribut eating_session = wenn ich die Zeit = setze, möchte ich sie auch über eine externe Serveranforderung validieren.Ich mache das mit Hilfe der Methode times() die auf einem anderen Server nachschlägt und alle möglichen Zeiten in der Variablen @times speichert.
Das Problem ist jetzt, dass die Methode times() das Attribut eating_session benötigt, um herauszufinden, welche Zeiten gültig sind, aber rails ruft manchmal zuerst die Methode times= auf, bevor sich eine eating_session im Reservierungsobjekt befindet, wenn ich nur @reservation = Reservation mache.neu (Parameter [: Reservierung])
class ReservationsController < ApplicationController
def new
@reservation = Reservation.new(params[:reservation])
# ...
end
end
class Reservation < ActiveRecord::Base
include SoapClient
attr_accessor :date, :time
belongs_to :eating_session
def time=(time)
@time = times.find { |t| t[:time] == time }
end
def times
return @times if defined? @times
@times = []
response = call_soap :search_availability {
# eating_session is sometimes nil
:session_id => eating_session.code, # <- HERE IS THE PROBLEM
:dining_date => date
}
response[:result].each do |result|
@times << {
:time => "#{DateTime.parse(result[:time]).strftime("%H:%M")}",
:correlation_data => result[:correlation_data]
}
end
@times
end
end
Ich habe keine Ahnung, wie ich das beheben soll, jede Hilfe wird abgelehnt.
Lösung
Was ich in diesem Fall oft mache, ist, den abhängigen Code in eine Validierung zu schieben:
class ReservationsController < ApplicationController
def new
@reservation = Reservation.new(params[:reservation])
# ...
end
end
class Reservation < ActiveRecord::Base
include SoapClient
attr_accessor :date, :time
belongs_to :eating_session
validate :validate_time
def validate_time
errors.add_to_base "Time is invalid" unless @time = times.find { |t| t[:time] == time }
end
def times
return @times if defined? @times
@times = []
response = call_soap :search_availability {
# eating_session is sometimes nil
:session_id => eating_session.code, # <- HERE IS THE PROBLEM
:dining_date => date
}
response[:result].each do |result|
@times << {
:time => "#{DateTime.parse(result[:time]).strftime("%H:%M")}",
:correlation_data => result[:correlation_data]
}
end
@times
end
end