activemerchant 未定义方法“月”

Posted

技术标签:

【中文标题】activemerchant 未定义方法“月”【英文标题】:activemerchant undefined method 'month' 【发布时间】:2012-10-09 12:26:37 【问题描述】:

我正在构建一个应用程序来处理不同服务的不同类型的交易,例如订阅、礼物订阅和购买。

我对礼品交易和 activemerchant 有疑问。我将简要概述它的工作原理。

用户创建礼品订阅并为其填写数据,将其存储在数据库中,然后在自定义“show_view”中显示给用户以供查看,然后用户继续在单独的表单,当他提交数据时,会调用控制器中的一个方法来处理事务,这就是我遇到问题的地方。

这是 gift_subscription.rb 模型

    def gift_purchase
    response = GATEWAY.purchase(price, credit_card, gift_purchase_options)
    GiftTransaction.create!(:action => "gift_purchase", :amount => price, :response => response)
    response.success?
  end
  private
  def gift_purchase_options
    
        :ip => ip_address,
        :billing_address => 
            :name     => name + last_name,
            :address1 => address1,
            :city     => city,
            :state    => state,
            :country  => "Mexico",
            :zip      => zip
        
    
  end

  def validate_card
    unless credit_card.valid?
      credit_card.errors.full_messages.each do |message|
        errors[:base] << message
      end
    end
  end

  def credit_card
    @credit_card = ActiveMerchant::Billing::CreditCard.new(
        :brand              => card_type,
        :number             => card_number,
        :verification_value => card_verification,
        :month              => card_expires_on.month,
        :year               => card_expires_on.year,
        :first_name         => name,
        :last_name          => last_name
    )

这里是 gift_subscription_controller.rb

def review
    @gift_subscription = GiftSubscription.find(params[:id])
  end

  def edit_review
    @gift_subscription = GiftSubscription.find(params[:id])
  end

  def update_review
  @gift_subscription = GiftSubscription.find(params[:id])

    respond_to do |format|
      if @gift_subscription.update_attributes(params[:gift_subscription])
        format.html  redirect_to "gift_subscriptions/review/#@gift_subscription.id", :notice => 'Gift subscription was successfully updated.' 
        format.json  head :no_content 
      else
        format.html  render :action => "edit_review" 
        format.json  render :json => @gift_subscription.errors, :status => :unprocessable_entity 
      end
    end
  end

  def do_gift_transaction
    @gift_subscription = GiftSubscription.find(params[:id])
    if @gift_subscription.gift_purchase
        redirect_to '/thank_you'
    else
        redirect_to "/gift_subscriptions/#@gift_subscription.id/failed_transaction"
    end
  end

  def failed_transaction
    @gift_subscription = GiftSubscription.find(params[:id])
    @gift_transactions = @gift_subscription.gift_transactions
  end

  def transaction_details
    @gift_subscription = GiftSubscription.find(params[:id])
  end

为了让事情更清楚一点,从控制器的 create 方法中,它会将用户重定向到评论操作,其中有一个 edit_review 以防他们想要更改某些内容,然后他们转到 transaction_details,他们输入信用卡信息,最后是方法调用 do_gift_transaction 来实际进行交易。

我得到的错误如下

NoMethodError in GiftSubscriptionsController#do_gift_transaction

undefined method `month' for nil:NilClass
Rails.root: /home/peanut/RubymineProjects/GiftBox

Application Trace | Framework Trace | Full Trace
app/models/gift_subscription.rb:44:in `credit_card'
app/models/gift_subscription.rb:12:in `gift_purchase'
app/controllers/gift_subscriptions_controller.rb:113:in `do_gift_transaction'

我一直在环顾四周,似乎找不到它为什么不识别月份...对于其他订阅,我的模型基本相同(有一些差异),但效果很好。在这里的任何帮助将不胜感激。

GiftSubscription 模型属性

attr_accessible :response, :name, :last_name, :address1, :address2,:city,
                  :state, :zip, :card_type, :ip_address, :price,
                  :duration, :created_at, :card_expires_on, :card_number,
                  :card_verification, :message

  has_one :gift_transactions, :class_name => "GiftTransaction"
  attr_accessor :card_number, :card_verification
  validate :validate_card, :on => :transaction_details

【问题讨论】:

您确定您使用的credit_card 有到期日吗? 对不起,我不明白你的意思。据我所知,Activemerchant 需要这些字段来验证每张卡。我也使用相同的方法来处理正常的订阅事务并且效果很好,唯一的区别是对于那些我实际上将 cc 信息存储在数据库中以进行定期订阅@Zach_Kemp undefined method month' for nil:NilClass` 意味着你在一个你期望是别的东西的 nil 对象上的某处调用month。我问的原因是card_expires_on.month 似乎是唯一调用.month 的地方。 是的,这是我唯一称呼它的地方,它正在用&lt;%= f.date_select :card_expires_on ...%&gt; 填充到 transaction_details 视图中 你能发布最后一个GiftSubscription模型的属性吗? 【参考方案1】:

所以在敲了几个小时后,结果发现它很简单......在输入信用卡数据的视图中,应该保存到数据库的字段没有被保存,因为我只有一个 link_to 按钮可以继续,所以当调用 credit_card 方法时,它是空的。

感谢lander16 指出这一点。

【讨论】:

以上是关于activemerchant 未定义方法“月”的主要内容,如果未能解决你的问题,请参考以下文章

Firefox 4 中的 JQuery 未定义和 $ 未定义错误 [关闭]

未捕获的引用错误,未定义通知

检查jQuery中的未定义和空值

使用 ActiveMerchant::Billing::EwayManagedGateway 的未初始化常量错误

未初始化的常量 ActiveMerchant::Billing::CreditCard::Validateable (NameError) - 在 Spree 商店

无法读取未定义和未处理的承诺拒绝的属性“捕获”