【问题标题】:Rails Conditional Validation in Model from Controller Session Data来自控制器会话数据的模型中的 Rails 条件验证
【发布时间】:2015-08-12 17:21:39
【问题描述】:

我正在尝试根据访问者是否参与测试有条件地验证 full_name 和 zip(参与测试的访问者将拥有某些会话数据) .我可以通过 customer.visitor_test() 将潜在客户控制器中的真/假传递给客户模型,但我无法从 in_test? 中的 in_test? 访问 @test模型。我错过了什么?

客户.rb

/* Stripped down code */

class Customer < ActiveRecord::Base
  attr_accessor    :test

  validates :full_name, presence: true, if: :not_in_test?
  validates :zip, presence: true, if: :in_test?

  def visitor_test(bool)
    @test = bool
  end

  def in_test?
    @test
  end

  def not_in_test?
    !self.in_test?
  end
end

leads_controller.rb

/* Stripped down code */

class LeadsController < ApplicationController
  def create
    session[:zip] = zip
    session[:email] = email
    session[:full_name] = full_name
    session[:email_opt_in] = email_opt_in
    session[:phone] = phone

    listing = Listing.where(id: listing_id).first

    customer = create_or_update_customer_from_session(listing)

    customer.visitor_test(/* true || false */)

    if customer.errors.blank?
      /* Do something */
    else
      /* Something else */
    end
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby model-view-controller model controller


    【解决方案1】:
    /* Stripped down code */
    
    class Customer < ActiveRecord::Base
      attr_accessor    :test
    
      validates :full_name, presence: true, if: :not_in_test?
      validates :zip, presence: true, if: :in_test?
    
      def in_test?
        test
      end
    
      def not_in_test?
        !in_test?
      end
    end
    

    attr_accessor 提供 setter 和 getter。

    /* Stripped down code */
    
    class LeadsController < ApplicationController
      def create
        session[:zip] = zip
        session[:email] = email
        session[:full_name] = full_name
        session[:email_opt_in] = email_opt_in
        session[:phone] = phone
    
        listing = Listing.where(id: listing_id).first
    
        customer = create_or_update_customer_from_session(listing)         customer.test = true     
    
        customer.save
    
        if customer.errors.blank?
          /* Do something */
        else
          /* Something else */
        end
      end
    end
    

    【讨论】:

    • 嗨,帕迪普。我尝试了您的解决方案,但 test 属性在 in_test? 中返回 nil。
    • customer.test = true 应该在调用保存请求之前设置customer = create_or_update_customer_from_session(listing)
    • 感谢您的回复!在create_or_update_customer_from_session() 调用之前放置customer.test = true 实际上给了我一个undefined local variable or method 'customer' 错误。但是你让我找到了正确的解决方案。我需要在customer.test = true 之后致电customer.save。因此,如果您可以更新您的答案以反映以下内容:customer = create_or_update_customer_from_session(listing) customer.test = true customer.save 那么我可以接受您的答案。
    • @fernando 很高兴听到,你的问题解决了。我已经更新了答案。
    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多