条纹支付:nil:NilClass 的未定义方法“价格”
Stripe Payment: undefined method `price' for nil:NilClass
我有一个正在测试条纹支付的应用程序。现在,我正在尝试配置收费,以便它从另一个模型 (pin.price) 获取价格并正确收费。到目前为止,我 运行 收到以下错误消息:
ChargesController 中没有方法错误#create
nil:NilClass
的未定义方法“价格”
app/controllers/charges_controller.rb
class ChargesController < ApplicationController
def create
# Amount in cents
@amount = (@pin.price * 100).floor
customer = Stripe::Customer.create(
:email => params[:stripeEmail],
:card => params[:stripeToken]
)
charge = Stripe::Charge.create(
:customer => customer.id,
:amount => @amount,
:description => 'Rails Stripe customer',
:currency => 'usd'
)
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to charges_path
end
end
app/controllers/pins_controller.rb
class PinsController < ApplicationController
before_action :set_pin, only: [:show, :edit, :update, :destroy, :bid]
before_action :correct_user, only: [:edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
.....
def pin_params
params.require(:pin).permit(:description, :price, :image, :manufacturer, :model)
end
end
app/db/migrate
class AddPriceToPins < ActiveRecord::Migration
def change
add_column :pins, :price, :decimal
end
end
我很确定错误来自“@amount = (@pin.price * 100).floor”,但我只是不确定如何更好地表达这个数量,所以每个图钉的价格都不是t 静态但与数据库中的当前输入值匹配。
编辑:包括带有 link 的表格以在此处分割支付代码:
<%= form_tag charges_path, id: 'chargesForm' do %>
<script src="https://checkout.stripe.com/checkout.js"></script>
<%= hidden_field_tag 'stripeToken' %>
<%= hidden_field_tag 'stripeEmail' %>
<button id="btn-buy" type="button" class="btn btn-success btn-lg btn-block"><span class="glyphicon glyphicon-heart"></span> I want this!</button>
<script>
var handler = StripeCheckout.configure({
key: '<%= Rails.configuration.stripe[:publishable_key] %>',
token: function(token, arg) {
document.getElementById("stripeToken").value = token.id;
document.getElementById("stripeEmail").value = token.email;
document.getElementById("chargesForm").submit();
}
});
document.getElementById('btn-buy').addEventListener('click', function(e) {
handler.open({
name: '<%= @pin.manufacturer %>',
description: '<%= @pin.description %>',
amount: '<%= (@pin.price * 100).floor %>'
});
e.preventDefault();
})
</script>
<% end %>
有什么想法吗?
问题是在您的收费控制器中 @pin
没有分配给任何东西,因此具有 nil
的值,因此出现错误。
因此,您需要先将 @pin
分配给一个值,然后再对其调用 price 。为此,您需要弄清楚如何从数据库中获取 pin 或是否创建它。
一种解决方案是在请求路径中传入 pin 的 id,例如
create_charge_path(pin_id: 123)
编辑:这不必硬编码为 123,它可以是您喜欢的任何引脚,仅取决于从何处调用它。例如。如果您从另一个已经从数据库中加载特定引脚的控制器操作调用,您可以这样做:
create_charge_path(pin_id: pin.id)
然后在你的ChargesController
class ChargesController < ApplicationController
def create
@pin = Pin.find(params[:pin_id])
# Amount in cents
@amount = (@pin.price * 100).floor
customer = Stripe::Customer.create(
:email => params[:stripeEmail],
:card => params[:stripeToken]
)
charge = Stripe::Charge.create(
:customer => customer.id,
:amount => @amount,
:description => 'Rails Stripe customer',
:currency => 'usd'
)
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to charges_path
end
end
然后这会将 @pin
分配给数据库 ID 为 123
的 pin。
我有一个正在测试条纹支付的应用程序。现在,我正在尝试配置收费,以便它从另一个模型 (pin.price) 获取价格并正确收费。到目前为止,我 运行 收到以下错误消息:
ChargesController 中没有方法错误#create nil:NilClass
的未定义方法“价格”app/controllers/charges_controller.rb
class ChargesController < ApplicationController
def create
# Amount in cents
@amount = (@pin.price * 100).floor
customer = Stripe::Customer.create(
:email => params[:stripeEmail],
:card => params[:stripeToken]
)
charge = Stripe::Charge.create(
:customer => customer.id,
:amount => @amount,
:description => 'Rails Stripe customer',
:currency => 'usd'
)
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to charges_path
end
end
app/controllers/pins_controller.rb
class PinsController < ApplicationController
before_action :set_pin, only: [:show, :edit, :update, :destroy, :bid]
before_action :correct_user, only: [:edit, :update, :destroy]
before_action :authenticate_user!, except: [:index, :show]
.....
def pin_params
params.require(:pin).permit(:description, :price, :image, :manufacturer, :model)
end
end
app/db/migrate
class AddPriceToPins < ActiveRecord::Migration
def change
add_column :pins, :price, :decimal
end
end
我很确定错误来自“@amount = (@pin.price * 100).floor”,但我只是不确定如何更好地表达这个数量,所以每个图钉的价格都不是t 静态但与数据库中的当前输入值匹配。
编辑:包括带有 link 的表格以在此处分割支付代码:
<%= form_tag charges_path, id: 'chargesForm' do %>
<script src="https://checkout.stripe.com/checkout.js"></script>
<%= hidden_field_tag 'stripeToken' %>
<%= hidden_field_tag 'stripeEmail' %>
<button id="btn-buy" type="button" class="btn btn-success btn-lg btn-block"><span class="glyphicon glyphicon-heart"></span> I want this!</button>
<script>
var handler = StripeCheckout.configure({
key: '<%= Rails.configuration.stripe[:publishable_key] %>',
token: function(token, arg) {
document.getElementById("stripeToken").value = token.id;
document.getElementById("stripeEmail").value = token.email;
document.getElementById("chargesForm").submit();
}
});
document.getElementById('btn-buy').addEventListener('click', function(e) {
handler.open({
name: '<%= @pin.manufacturer %>',
description: '<%= @pin.description %>',
amount: '<%= (@pin.price * 100).floor %>'
});
e.preventDefault();
})
</script>
<% end %>
有什么想法吗?
问题是在您的收费控制器中 @pin
没有分配给任何东西,因此具有 nil
的值,因此出现错误。
因此,您需要先将 @pin
分配给一个值,然后再对其调用 price 。为此,您需要弄清楚如何从数据库中获取 pin 或是否创建它。
一种解决方案是在请求路径中传入 pin 的 id,例如
create_charge_path(pin_id: 123)
编辑:这不必硬编码为 123,它可以是您喜欢的任何引脚,仅取决于从何处调用它。例如。如果您从另一个已经从数据库中加载特定引脚的控制器操作调用,您可以这样做:
create_charge_path(pin_id: pin.id)
然后在你的ChargesController
class ChargesController < ApplicationController
def create
@pin = Pin.find(params[:pin_id])
# Amount in cents
@amount = (@pin.price * 100).floor
customer = Stripe::Customer.create(
:email => params[:stripeEmail],
:card => params[:stripeToken]
)
charge = Stripe::Charge.create(
:customer => customer.id,
:amount => @amount,
:description => 'Rails Stripe customer',
:currency => 'usd'
)
rescue Stripe::CardError => e
flash[:error] = e.message
redirect_to charges_path
end
end
然后这会将 @pin
分配给数据库 ID 为 123
的 pin。