Tutorial :Question regarding the creation of an credit_card object on Ryan bates Active_Merchant intergration video


I was going through Ryan Bates' video on Active Merchant integration video Railscast #145 and my question was regarding the creation of the @credit_card method that he defines within the Order.rb method.

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    )  


What I don't follow is how does this method get called. The form_for in the new method creates an @order object while and there is no mention of the credit_card method. How does the credit_card method get called to initiate the creation of the @credit_card object.

I am aware of virtual attributes but I dont know how the credit_card method is actually called.


Looking at the screencast code here.

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

We can see the order form, and from the first line

<% form_for @order do |f| %>  

We see that, on submission, the form use the oders_controller create method.

In 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  

We can see that @order is Order instance built from the cart. Nothing special here This order is now saved with @order.save and then the purchase method is called on @order

Let's take a look at this purchase method!

in 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  

Second line response = GATEWAY.purchase(price_in_cents, credit_card, purchase_options) . The credit_card method is called there as an argument of GATEWAY.purchase

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »