Params ordre Foo.new (params [: foo]), ont besoin d'une avant les autres (Rails)
-
23-09-2019 - |
Question
J'ai un problème que je ne sais pas comment résoudre. Il a à voir avec le hachage params non triés.
J'ai une réservation d'objet qui a un temps virtuel = attribut et un eating_session virtuel = attribut quand je mis le temps = Je veux aussi le valider via une requête de serveur externe. Je le fais avec l'aide des temps de () qui fait une recherche sur un autre serveur et enregistre tous les temps possibles dans la variable @times.
Le problème est maintenant que les temps de méthode () a besoin de l'attribut eating_session pour savoir quels temps sont valables, mais les rails appelle parfois le temps = méthode d'abord, avant qu'il y ait eating_session dans l'objet de réservation quand je fais juste @reservation = Reservation.new (params [: réservation])
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
Je ne sais pas comment résoudre ce problème, toute aide est apriciated.
La solution
Ce que je fais souvent dans ce cas est pousser le code dépendant dans une validation:
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