Reputation: 4792
I have a model Payment
, use to track credit card transactions. Now I'm trying to get it to map some values that PayPal returns on a successful credit card transaction. This is handled by a notify = ActiveMerchant::Billing::Integrations::Paypal::Notification.new(raw_post)
(phew that was long)
However, the method I wrote does not work in Console. Yet if I assigned them directly, it works.
e.g. Rails Console
notify = ActiveMerchant::Billing::Integrations::Paypal::Notification.new(raw_post)
# Works
payment = Payment.new
payment.raw_response = notify.raw
save! # Save is successful
# Does not work
payment = Payment.new
payment.map_paypal_return(notify) # save! call in this method does not trigger errors.
Please take a look at my class.
class Payment < ActiveRecord::Base
belongs_to :order
def map_paypal_return(notify)
puts "in mapping" => Outputted
raw_response = notify.raw
payment_status = notify.status
order_identifier = notify.item_id # Map ID to ID as a safety check bah.
payer_email = notify.params["payer_email"]
receiver_account = notify.account
auth_mode = notify.params["payment_type"]
transaction_identifier = notify.invoice
currency = notify.currency
amount = notify.gross
puts self.attributes # Returns attributes without the above assignments
save! # No errors triggered =(
end
end
Method call in Console
1.9.2p318 :032 > notify.invoice # This should have been mapped to transaction_identifier
=> "2012-146"
1.9.2p318 :031 > p.map_paypal_return(notify)
in mapping
{"id"=>nil, "order_id"=>nil, "order_identifier"=>nil, "card_holder_name"=>nil, "auth_mode"=>nil, "amount"=>nil, "amount_string"=>nil, "currency"=>nil, "merchant_reference"=>nil, "transaction_identifier"=>nil, "status"=>nil, "other_errors"=>nil, "received_date"=>nil, "deleted"=>nil, "created_at"=>nil, "updated_at"=>nil, "state"=>"checkout", "payment_type"=>nil, "raw_response"=>nil, "receiver_account"=>nil, "payer_email"=>nil}
SQL (47.4ms) INSERT INTO "payments" ("amount", "amount_string", "auth_mode", "card_holder_name", "created_at", "currency", "deleted", "merchant_reference", "order_id", "order_identifier", "other_errors", "payer_email", "payment_type", "raw_response", "received_date", "receiver_account", "state", "status", "transaction_identifier", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [["amount", nil], ["amount_string", nil], ["auth_mode", nil], ["card_holder_name", nil], ["created_at", Sat, 05 May 2012 20:32:33 SGT +08:00], ["currency", nil], ["deleted", nil], ["merchant_reference", nil], ["order_id", nil], ["order_identifier", nil], ["other_errors", nil], ["payer_email", nil], ["payment_type", nil], ["raw_response", nil], ["received_date", nil], ["receiver_account", nil], ["state", "checkout"], ["status", nil], ["transaction_identifier", nil], ["updated_at", Sat, 05 May 2012 20:32:33 SGT +08:00]]
=> true
I don't know if I made a silly fundamental misunderstanding of Ruby/Rails somewhere. Greatly appreciate the help.
Upvotes: 0
Views: 1224
Reputation: 13877
I notice you have in your map_paypal_return
method
raw_response = notify.raw
when raw_response
is one of the object attributes. To assign an ActiveRecord-supplied attribute inside a method of the respective class, you need to do
self.raw_response = notify.raw
And similarly for the other assignments to attributes in the method.
This is a limitation of ruby. The attribute methods are implemented by defining the attribute=
method (e.g. raw_response=
), and without a qualifier (obj.
or self.
) ruby assumes the statement is just a local variable assignment.
Upvotes: 3