Orden de parámetros en Foo.new(params[:foo]), se necesita uno antes que el otro (Rails)

StackOverflow https://stackoverflow.com/questions/2541708

  •  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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top