ordine Parametri in Foo.new (params [: foo]), hanno bisogno di una prima che gli altri (Rails)

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

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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top