条纹“invalid_request_error” - 卡号未从表单传递到模型方法
Posted
技术标签:
【中文标题】条纹“invalid_request_error” - 卡号未从表单传递到模型方法【英文标题】:Stripe "invalid_request_error" - Card number not being passed from form to model method 【发布时间】:2014-06-23 06:05:24 【问题描述】:我正在将带有 Stripe 的活跃商家集成到我的 rails 应用程序中,当我检查 Stripe 日志时,我看到以下内容:
type: "invalid_request_error"
message: "You must supply either a card or a customer id"
卡号没有从我的视图中的表单传递到我的模型中的方法。
我必须在我的控制器中进行修改才能使其正常工作,但我不确定是什么。
型号
class Order < ActiveRecord::Base
has_many :order_products
has_many :products, through: :order_products
attr_accessor :card_number, :security_code, :card_expires_on
def credit_card
@credit_card ||= ActiveMerchant::Billing::CreditCard.new(
:number => card_number,
:first_name => first_name,
:last_name => last_name,
:verification_value => security_code,
:month => card_expires_onmonth,
:year => card_expires_onyear
)
end
def purchase(basket)
response = GATEWAY.purchase(Product.total_basket_price(basket)*100, credit_card)
end
end
控制器
class OrdersController < ApplicationController
def create
@order = Order.new
basket.each do |item_id|
@order.order_products.build(product: Product.find(item_id))
end
if @order.save!
if @order.purchase(basket)
render "show"
else
render "new"
end
else
render "new"
end
end
end
查看
<%= simple_form_for @order do |f| %>
<%= f.input :card_number %>
<%= f.input :security_code, label: "Security code (CVC)" %>
<%= f.input :card_expires_on, as: :date, discard_day: true, add_month_numbers: true, start_year: Date.today.year, end_year: Date.today.year + 10, order: [:month, :year], label: "Card expiration date" %>
<%= f.button :submit, "Confirm and pay" %>
<% end %>
谁能提出解决方案?
非常感谢
【问题讨论】:
你的 Rails 版本是多少? 嘿@Kirti 这是 4.0.3 【参考方案1】:您没有使用从表单传递的值创建 order
对象,这就是您收到错误的原因。
注意: @order = Order.new
在 create
操作中。这将简单地创建一个没有属性集的Order
模型实例。
使用 Rails 4,您需要将希望保存的属性(甚至是虚拟属性)列入白名单。
因此,更新create
操作中的@order
实例化如下:
@order = Order.new(order_params)
在你的控制器的order_params
方法中,确保你允许这些属性。
更新:
如下更改您的order_params
:
def order_params
if params[:order]["card_expires_on(1i)"] && params[:order]["card_expires_on(2i)"] && params[:order]["card_expires_on(3i)"]
## Set "card_expires_on" to a "Date" object created using the three values
## passed from the form "card_expires_on(1i)" and "card_expires_on(2i)", "card_expires_on(3i)"
params[:order][:card_expires_on] = Date.new(params[:order].delete("card_expires_on(1i)").to_i, params[:order].delete("card_expires_on(2i)").to_i , params[:order].delete("card_expires_on(3i)").to_i)
end
params.require(:order).permit(:card_number, :security_code, :card_expires_on )
end
更新Order
模型中的credit_card
方法如下所示:
def credit_card
@credit_card ||= ActiveMerchant::Billing::CreditCard.new(
:number => card_number,
:first_name => first_name,
:last_name => last_name,
:verification_value => security_code,
:month => card_expires_on.month, ## Get "month" from date object
:year => card_expires_on.year ## Get "year" from date object
)
end
注意:
card_expires_on.month
而不是card_expires_onmonth
与
card_expires_on.year
而不是card_expires_onyear
如您在表单提交时生成的参数中所见(突出显示):
"utf8"=>"✓", "authenticity_token"=>"ZWlCaOUPbignlnoULIMpfMCcD9NXQ2Czb0hcQyq9ad4=", "order"=>"first_name"=>"", "last_name"=>"", "email"=>"", "address_1"=>"", "address_2"=>"", "city"=>"", "postal_code"=>"", "country_code"=>"英国", "card_number"=>"4242424242424242", "security_code"=>"123", "card_expires_on(3i)"=>"1", "card_expires_on(2i)"=>"5", "card_expires_on(1i)"=>"2016", "commit"=>"确认并付款"
对于日期字段card_expires_on
,您会收到三个不同的键名
card_expires_on(1i)
=> 指向“年”
card_expires_on(2i)
=> 指向“月”
card_expires_on(3i)
=> 指向“日期”的默认设置为 1 并带有一个隐藏字段,因为您不允许它输入它
【讨论】:
嗨@Kirti,所以我之前尝试过这样的白名单,但由于某种原因它没有用。我现在遇到了:card_expires_on
属性的错误,这是我期待的,因为正如您在 Order 模型中看到的那样,我已经说过 :month => card_expires_onmonth
和 :year => card_expires_onyear
。 Ryan Bates 的 railscast 使用 card_expires_on.month
但这对我不起作用。我得到的错误是multiparameter assignment error
分享表单提交时生成的参数哈希。所以我可以看到你到底是如何传递card_expires_on
。
"utf8"=>"✓", "authenticity_token"=>"ZWlCaOUPbignlnoULIMpfMCcD9NXQ2Czb0hcQyq9ad4=", "order"=>"first_name"=>"", "last_name"=>"", "email"=>"", "address_1"=>"", "address_2"=>"", "city"=>"", "postal_code"=>"", "country_code"=>"United Kingdom", "card_number"=>"4242424242424242", "security_code"=>"123", "card_expires_on(3i)"=>"1", "card_expires_on(2i)"=>"5", "card_expires_on(1i)"=>"2016", "commit"=>"Confirm and pay"
这是完整的错误信息:1 error(s) on assignment of multiparameter attributes [error on assignment [1, 5, 2016] to card_expires_on (undefined method "klass" for nil:NilClass)]
好的。知道了。 card_expires_on
需要一点点调整。阅读我的回答中的UPDATE
部分并完全按照它进行操作,您的问题应该会得到解决。以上是关于条纹“invalid_request_error” - 卡号未从表单传递到模型方法的主要内容,如果未能解决你的问题,请参考以下文章