【发布时间】:2016-08-10 20:15:27
【问题描述】:
我正在使用一种方法来尝试将两个变量相乘,如下所示 -
def total_amount
self.quantity.to_i * self.event.price.to_i
end
我正在使用 Ruby on Rails 构建一个活动应用程序,该方法的目的是允许一个用户为付费活动预订多个空间。
该方法根本不起作用,因为当我点击付款时,金额仅显示为 0(零)。该方法在我的预订模型中,在我的预订控制器中,我有以下代码 -
class BookingsController < ApplicationController
before_action :authenticate_user!
def new
@event = Event.find(params[:event_id])
@booking = @event.bookings.new(quantity: params[:quantity])
@booking.user = current_user
end
def create
@event = Event.find(params[:event_id])
@booking = @event.bookings.new(booking_params)
@booking.user = current_user
Booking.transaction do
@event.reload
if @event.bookings.count > @event.number_of_spaces
flash[:warning] = "Sorry, this event is fully booked."
raise ActiveRecord::Rollback, "event is fully booked"
end
end
if @booking.save
# CHARGE THE USER WHO'S BOOKED
# #{} == puts a variable into a string
Stripe::Charge.create(
amount: @event.price_pennies,
currency: "gbp",
card: @booking.stripe_token,
description: "Booking number #{@booking.id}")
flash[:success] = "Your place on our event has been booked"
redirect_to event_path(@event)
else
flash[:error] = "Payment unsuccessful"
render "new"
end
if @event.is_free?
@booking.save!
flash[:success] = "Your place on our event has been booked"
redirect_to event_path(@event)
end
end
private
def booking_params
params.require(:booking).permit(:stripe_token, :quantity)
end
end
我的 events.show 表单上有一个输入空间,允许用户输入他们需要的空间数量。预订表格有以下代码行,应该反映所需的总金额 -
<p>Total Amount<%= @booking.total_amount %></p>
我在两个变量中都添加了.to_i,因为没有这个我收到了 NilClass 错误。我该如何修改它以便该方法创建正确的输出?
【问题讨论】:
-
nil.to_i为零,因此如果其中任何一个值为 nil,则乘法将返回零。 -
在我使用的尝试中,两者都不会为零。我用 2 表示数量,用 1.50 英镑表示价格。但输出为零。
-
这可能是因为货币符号。
'1.50'.to_i是 1,'1.50'.to_f是 1.50,'£1.50'.to_i是 0。这就是 ruby 字符串到整数转换的工作原理。您应该使用浮点数作为货币并在转换之前去掉£ -
是不是就这么简单就用.to_f呢?
-
不,因为
£符号。如果你确定字符串的第一个字符是£,你可以直接使用string[1..-1].to_f。或查看themonetizegem,即Monetize.parse('£100.01').to_f
标签: ruby-on-rails ruby ruby-on-rails-4 model-view-controller methods