Parameter Reihenfolge in Foo.neu (Parameter [: foo]), brauche eins vor dem anderen (Schienen)

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

  •  23-09-2019
  •  | 
  •  

Frage

Ich habe ein Problem, das ich nicht beheben kann.Es hat mit dem unsortierten Parameter-Hash zu tun.

Ich habe eine Objektreservierung mit einem virtuellen Attribut time = und einem virtuellen Attribut eating_session = wenn ich die Zeit = setze, möchte ich sie auch über eine externe Serveranforderung validieren.Ich mache das mit Hilfe der Methode times() die auf einem anderen Server nachschlägt und alle möglichen Zeiten in der Variablen @times speichert.

Das Problem ist jetzt, dass die Methode times() das Attribut eating_session benötigt, um herauszufinden, welche Zeiten gültig sind, aber rails ruft manchmal zuerst die Methode times= auf, bevor sich eine eating_session im Reservierungsobjekt befindet, wenn ich nur @reservation = Reservation mache.neu (Parameter [: Reservierung])

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

Ich habe keine Ahnung, wie ich das beheben soll, jede Hilfe wird abgelehnt.

War es hilfreich?

Lösung

Was ich in diesem Fall oft mache, ist, den abhängigen Code in eine Validierung zu schieben:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top