Params ordre Foo.new (params [: foo]), ont besoin d'une avant les autres (Rails)

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

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

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top