0

Я использую метод, чтобы попытаться умножить две переменные следующим образом -Рубин - как преумножить переменные в методе

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. Как я могу изменить это, чтобы метод создавал правильный результат?

+1

'nil.to_i' равен нулю, так что, если любой из этих значений равна нулю, умножение будет возвращать ноль. –

+0

В попытках, которые я использовал, ни один из них не был бы равен нулю. Я использовал 2 для количества и £ 1.50 за цену. Но выход был равен нулю. –

+0

Скорее всего, это символ валюты. '1.50'.to_i' равно 1,' 1.50'.to_f' равно 1.50, а '' 1,50'.to_i' равно 0. Вот как работает преобразование ruby ​​string-to-integer. Вы должны использовать поплавки для валюты и вытеснять '£' перед конвертированием –

ответ

-2

Если вы вызываете booking.new, это означает, что вы создаете экземпляр класса, где self. означает, что вы используете переменную класса.

Удалить self.

+0

Простите меня, если я ошибаюсь, и я счастлив быть таким. Но в контексте метода экземпляра я считаю, что 'self' разрешается экземпляру, а не классу. Если в контексте метода экземпляра вы хотите перейти к переменной класса, вы бы сделали что-то вроде 'self.class.class_variable'. Итак, 'количество * event.price' ** должно ** быть таким же, как' self.quantity * self.event.price'. Опять же, извиняюсь заранее, если я ошибаюсь. – jvillian

+0

Возможно, вы правы, но я думаю, что это больше связано с ответами выше - знак £ выводит вывод на 0 (ноль). Я думаю, что это главный вопрос. –

+2

@jvillian абсолютно корректен; единственные разы, когда добавление 'self.' к методу имеет какое-либо значение, следующие: 1) определение метода класса, 2) вызов метода на себя, который затенен локальной переменной с тем же именем, 3) устранение неоднозначности сеттера на себе из локального назначения переменных и 4) вызова частных методов (которые не будут выполняться при вызове с явным получателем, даже если этот ресивер сам ... за исключением случая, когда частный сеттер, для которого сделано исключение, чтобы избежать синтаксиса неоднозначность). – philomory

0

Вы можете использовать регулярное выражение, чтобы лишить ваш символ валюты

def total_amount 
    quantity.to_i * strip_currency(event.price) 
end 

private 

def strip_currency(amount = '') 
    amount.to_s.gsub(/[^\d\.]/, '').to_f 
end 
+0

Привет, Я попытался реализовать вышеуказанные методы, но получаю ошибку «неопределенный метод gsub». Как исправить это? Я чувствую, что я очень близка к тому, чтобы получить ответ на мой вопрос. Надеюсь, ты сможешь ответить. –

+0

проверить, является ли значение, которое вы получаете для суммы, является строкой или преобразовывает ее в строку с использованием 'amount.to_s' –

+0

Должен ли я использовать сумму в методе, поскольку у меня ее нет в моей таблице бронирования или событий? Ввод суммы.to_s в указанном выше методе просто приводит к синтаксической ошибке. –

Смежные вопросы