Порядок параметров в Foo.new(params[:foo]), нужен один перед другим (Rails)
-
23-09-2019 - |
Вопрос
У меня проблема, которую я не знаю, как решить.Это связано с несортированным хэшем параметров.
У меня есть резервирование объекта, которое имеет атрибут virtual time= и атрибут virtual eating_session=, когда я устанавливаю time=, я также хочу проверить его с помощью запроса внешнего сервера.Я делаю это с помощью метода times(), который выполняет поиск на другом сервере и сохраняет все возможные времена в переменной @times.
Проблема теперь в том, что методу times() нужен атрибут eating_session, чтобы узнать, какие времена действительны, но rails иногда сначала вызывает метод times=, прежде чем в объекте бронирования появится какая-либо eating_session, когда я просто делаю @reservation = Reservation.new(params[:reservation])
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
Я понятия не имею, как это исправить, любая помощь приветствуется.
Решение
Что я часто делаю в этом случае, так это помещаю зависимый код в проверку:
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