Orden de parámetros en Foo.new(params[:foo]), se necesita uno antes que el otro (Rails)
-
23-09-2019 - |
Pregunta
Tengo un problema que no sé como solucionar.Tiene que ver con el hash de parámetros sin clasificar.
Tengo un objeto Reserva que tiene un atributo de tiempo virtual = y un atributo virtual de sesión_comida = cuando configuro el tiempo = También quiero validarlo a través de una solicitud de servidor externo.Lo hago con la ayuda del método times() que realiza una búsqueda en otro servidor y guarda todos los tiempos posibles en la variable @times.
El problema ahora es que el método times() necesita el atributo eat_session para saber qué horarios son válidos, pero Rails a veces llama primero al método times=, antes de que haya cualquier eat_session en el objeto Reservation cuando simplemente hago @reservation = Reservation. nuevo(parámetros[:reserva])
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
No tengo idea de cómo solucionar este problema, se agradece cualquier ayuda.
Solución
Lo que hago a menudo en este caso es insertar el código dependiente en una validación:
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