0

내가 시도하고 다음과 같이 두 개의 변수를 곱 방법을 사용하고 방법 내에서 변수를 곱하는 방법 방법은 한 사용자가 유료 이벤트를 위해 여러 공간을 예약 할 수있게하는 것입니다.루비 -</p> <pre><code>def total_amount self.quantity.to_i * self.event.price.to_i end </code></pre> <p>을 나는 레일에 루비를 사용하여 이벤트 응용 프로그램과의 목표를 짓고 있어요 -

금액을 단순히 0으로 표시하는 방식으로 클릭하여 지불하는 방식으로 작동하지 않습니다. 내가 입력에 그들이 필요로 공간의 수를 사용자가 수 내 events.show 양식에 입력 공간이

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 

- 방법은 내 예약 컨트롤러에서 나는 다음과 같은 코드를 가지고, 내 예약 모델입니다. I는 NilClass 에러 수신이없는 것처럼

<p>Total Amount<%= @booking.total_amount %></p> 

I는 두 변수 .to_i 추가 - 예약 양식이 요구 총량을 반영해야 다음의 코드를 갖는다. 이 방법으로 올바른 결과가 만들어 지도록 수정하는 방법은 무엇입니까?

+1

'nil.to_i'가 제로이기 때문에 그 값 중 하나가 곱셈 전무 인 경우 0을 반환합니다. –

+0

내가 사용한 시도에서 둘 다 0 일 것입니다. 수량에 2, 가격에 1.50을 사용했습니다. 그러나 생산량은 0이었다. –

+0

통화 기호 때문일 가능성이 큽니다. ''1.50 '.to_i'는 1,''1.50'to_f''는 1.50,''1.50'to_i''는 0입니다. 이것은 루비 문자열 - 정수 변환이 작동하는 방식입니다. 당신은 통화를 위해 float을 사용하고 변환하기 전에'£'을 제거해야합니다. –

답변

-2

booking.new을 호출하는 경우 클래스의 인스턴스를 만드는 것입니다. 여기서 self.은 클래스 변수를 사용한다는 의미입니다.

self을 제거하십시오.

+0

내가 틀렸다면 기꺼이 용서해주십시오. 그러나 인스턴스 메소드의 맥락에서, 나는'자기 (self) '가 클래스가 아닌 인스턴스 (instance)로 해석된다고 믿는다. 인스턴스 메소드의 컨텍스트에서 클래스 변수를 가져 오려면'self.class.class_variable'과 같은 일을해야합니다. 그래서,'quantity * event.price' **는'self.quantity * self.event.price'와 같아야합니다 **. 다시 말하면, 내가 잘못했으면 미리 사과해야한다. – jvillian

+0

당신이 옳을 수도 있지만 위의 응답과 더 관련이 있다고 생각합니다. 파운드 기호는 출력을 0으로 렌더링합니다. 나는 이것이 주요 문제라고 생각한다. –

+2

@ jvillian은 완전히 정확합니다. 메소드에 "self"를 추가하는 유일한 시간은 1) 클래스 메소드 정의, 2) 동일한 이름의 로컬 변수에 의해 그려진 메소드를 호출하는 것, 3) 셀터에 대한 설정자를 모호하게하는 것 4) private 메소드를 호출한다. (명시 적 리시버로 호출 할 때, 리시버가 자기 라 할지라도 실패 할 것이다 ... 구문을 피하기 위해 예외가있는 private setter의 경우 제외) 모호). – 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에 대한 값이 string인지 확인하고'amount.to_s'를 사용하여 문자열로 변환하십시오 –

+0

예약 또는 이벤트 테이블에이 금액이 저장되어 있지 않기 때문에 금액을 사용해야합니까? 위의 메소드에 amount.to_s를두면 구문 오류가 발생합니다. –

관련 문제