ordine Parametri in Foo.new (params [: foo]), hanno bisogno di una prima che gli altri (Rails)
-
23-09-2019 - |
Domanda
Ho un problema che non so come risolvere. Ha a che fare con l'hash params indifferenziati.
Ho una prenotazione oggetto che ha un tempo virtuale = attributo ed un eating_session virtuale = attributo quando ho impostato il tempo = Voglio anche convalidare tramite una richiesta server esterno. Lo faccio con l'aiuto dei tempi () metodo che fa una ricerca su un altro server e salva tutti i tempi possibili nella variabile @times.
Il problema ora è che i tempi () metodo ha bisogno l'attributo eating_session per scoprire quali gli orari sono validi, ma a volte le rotaie chiama il metodo di volte = primo, prima che ci sia alcuna eating_session nell'oggetto prenotazione quando faccio e basta @reservation = Reservation.new (params [: prenotazione])
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
Non ho idea di come risolvere questo problema, ogni aiuto è apriciated.
Soluzione
Quello che faccio spesso in questo caso è spingere il codice dipendente in una convalida:
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