2014-07-22 75 views
0

我使用Ruby on Rails 4.1創建了一個訂票應用程序,作爲我的示例項目。三種模式 - 活動,門票和預訂。活動有許多門票和預訂。門票有很多預訂,它們屬於事件。預訂屬於活動和門票。嵌套資源 - 無方法錯誤

的路由文件看起來像:

Rails.application.routes.draw do 

resources :charges 

root 'events#index' 

resources :events do 
resources :tickets 
resources :bookings 
end 
end 

的按鈕,它具有以下代碼的新的預訂頁面位於我的事件/節目頁:

<% @event.tickets.each do |ticket| %> 
<div class="row"> 
<div class="col-md-8"> 
    <table class="table"> 
    <thead> 
      <tr> 
       <th>Name</th> 
       <th>Price</th> 
       <th>Quantity</th> 
      </tr> 
     </thead> 
     <tbody> 
      <tr> 
       <td><%= ticket.ticket_name %></td> 
       <td><%= ticket.ticket_price %></td> 
       <td><%= ticket.ticket_quantity %></td> 
       <td><%= link_to "Buy Now", new_event_booking_path(@event, ticket), class: "btn btn-primary" %></td> 
       <td><%= link_to "Edit", edit_event_ticket_path(@event, ticket), class: "btn btn-link" %></td> 
       <td><%= link_to "Delete", event_ticket_path(@event, ticket), method: :delete, data: { confirm: "Are you sure?" }, class: "btn btn-link" %></td> 
     </tr> 
    </table> 
</div> 
</div> 

由於你可以看到,當用戶點擊「立即購買」按鈕時,事件和票據變量被抓取。然而,當我在我的預約控制器使用下面的代碼:

class BookingsController < ApplicationController 

def new 
@event = Event.find(params[:event_id]) 
@ticket = @event.tickets.find(params[:id]) 
@booking = Booking.new 
end 

def create 
@event = Event.find(params[:event_id]) 
@ticket = @event.tickets.find(params[:id]) 
@booking = @event.bookings.create(booking_params) 

if @booking.save 
    redirect_to [@event, @booking] 
else 
    render 'new' 
end 
end 

def show 
@event = Event.find(params[:event_id]) 
@booking = @event.bookings.find(params[:id]) 
end 

    private 
    def booking_params 
params.require(:booking).permit(:buyer_name, :email, :mobile, :address, :order_quantity) 
    end 
end 

我得到的ActiveRecord :: RecordNotFound在BookingsController#新。如果沒有ID錯誤,找不到票證。

新頁面看起來像這樣(初具雛形,我對功能性測試)

<%= form_for ([@event, @booking]) do |f| %> 
<div class="row"> 
    <div class="form-group"> 
    <%= f.label :buyer_name %> 
    <%= f.text_field :buyer_name, class: "form-control" %> 
    </div> 
    <div class="form-group"> 
    <%= f.label :order_quantity %> 
    <%= f.text_field :order_quantity, class: "form-control" %> 
    </div> 

</div> 
    <%= f.submit "Pay now", class: "btn btn-primary" %> 

的活動型號:

has_many :tickets, dependent: :destroy 
has_many :bookings 
has_many :charges 

門票模式:

belongs_to :event 
has_many :bookings 

預訂模式:

belongs_to :event 
belongs_to :ticket 
has_many :charges 

的外鍵關聯看起來是這樣的:

add_reference :bookings, :ticket, index: true 

如何解決這個問題?

+0

我認爲'new_event_booking_path(@event,ticket)'發送了錯誤的參數。 'params [:id]'是零。 – xlembouras

+0

你有這個GitHub頁嗎? –

+0

@DougSteinberg你走吧。 https://bitbucket.org/stravarius/ticket-fire – user3224820

回答

1

您無法將您購票的方式添加到new_event_booking_path。取而代之的是,做這種方式:

new_event_booking_path(@event, ticket_id: ticket.id) 

注意,我們添加名爲ticket_id到路徑的附加參數。這是因爲event_booking_path的路線不知道任何關於票證的內容。

然後,在你的控制器,找到這樣的票:

@ticket = @event.tickets.find(params[:ticket_id]) 

更新

在你的窗體中添加一個隱藏字段爲ticket_id這樣的:

<%= hidden_field_tag :ticket_id, @ticket.id.to_s %> 
+0

我改變了它,新的表格現在呈現良好。但是,當我點擊提交按鈕時發生同樣的錯誤。在創建操作中,錯誤表示無法找到沒有ID的Ticket。只做了你在這兩個地方建議的改變。 – user3224820

+0

更新了答案。 – San

+0

仍然收到相同的錯誤。在該值中,您建議使用實例變量作爲票證。但是表單塊只使用事件和預訂實例變量。使用權是否正確? – user3224820

0

你需要採取@ticket出newcreate

@ticket = @event.tickets.find(params[:id]) 

沒有params[:id]從立即購買鏈接

在傳遞乘坐該線路輸出的newcreate的行動和你的錯誤應該消失

+0

有多個票層 - 早起的鳥兒,學生等等,我需要票據變量來獲得相應的機票ID號碼並與預訂相關聯。此外,我需要使用它來訪問總票數量,門票價格等。 – user3224820

+0

那麼,'params [:id]'不會從鏈接傳遞到您的操作。您需要找到一種方法將票證ID添加到操作中。有一件事我從路線中注意到,「票據」和「預訂」嵌套在同一個名稱空間中。您需要生成一個類似'/ booking/22/ticket/12'的路線才能訪問預訂ID和票證ID。所以你需要在預訂中嵌入票據路線才能獲得。問題在於它會弄亂你已經在你的應用中設置的很多鏈接。所以你真的要重做很多東西才能使它工作 –