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=>ca开发者_C百科rd_expires_on.month,
:year=>card_expires_on.year,
:first_name=>first_name,
:last_name=>last_name
)
end
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
精彩评论