有关在Ryan上创建credit_card对象的问题请参阅Active_Merchant整合视频

时间:2009-11-08 18:50:44

标签: ruby-on-rails paypal activemerchant

我正在浏览Ryan Bates关于Active Merchant集成视频Railscast#145的视频,我的问题是关于他在Order.rb方法中定义的@credit_card方法的创建。

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

我不遵循的是如何调用此方法。新方法中的form_for创建了一个@order对象,而没有提及credit_card方法。如何调用credit_card方法来启动@credit_card对象的创建。

我知道虚拟属性,但我不知道如何实际调用credit_card方法。

1 个答案:

答案 0 :(得分:1)

查看截屏视频代码here

在app / views / orders / new.html.erb

我们可以看到订单表格,并从第一行

<% form_for @order do |f| %>

我们看到,在提交时,表单使用oders_controller创建方法。

在app / controller / orders_controller.rb

    def create
      @order = current_cart.build_order(params[:order])
      @order.ip_address = request.remote_ip

      if @order.save
        if @order.purchase
          render :action => "success"
        else
          render :action => "failure"
        end
      else
        render :action => 'new'
      end
    end

我们可以看到@order是从购物车构建的Order实例。这里没什么特别的 此订单现在保存为@order.save,然后在@order

上调用购买方法

让我们来看看这种购买方式!

app / model / order.rb

中的

    def purchase
      response = GATEWAY.purchase(price_in_cents, credit_card, purchase_options)
      transactions.create!(:action => "purchase", :amount => price_in_cents, :response => response)
      cart.update_attribute(:purchased_at, Time.now) if response.success?
      response.success?
    end

第二行response = GATEWAY.purchase(price_in_cents, credit_card, purchase_options) 。 credit_card方法在那里被称为GATEWAY.purchase

的参数