在Foo中Params顺序。新的(params[:foo]),需要一个在另一个之前(Rails)

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

  •  23-09-2019
  •  | 
  •  

我有一个问题,我不知道如何解决。它与未排序的params哈希有关。

我有一个对象预留,它有一个虚拟的time=属性和一个虚拟的eating_session=属性,当我设置time=我也想通过外部服务器请求验证它。我在方法times()的帮助下做到这一点,该方法在其他服务器上进行查找,并将所有可能的时间保存在@times变量中。

现在的问题是,方法times()需要eating_session属性来找出哪些时间是有效的,但是rails有时会先调用times=方法,在我只是做@reservation=Reservation时,在Reservation对象中有任何eating_session之前。新(params[:预订])

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

我不知道如何解决这个问题,任何帮助都是apriciated。

有帮助吗?

解决方案

在这种情况下,我经常做的是将依赖代码推送到验证中:

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top