我使用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>
正如您所看到的,当用户点击&#34;立即购买时,会抓取事件和故障单变量。按钮。但是,当我在预订控制器中使用以下代码时:
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
我在BookingsController #new中得到 ActiveRecord :: RecordNotFound。无法在没有ID 错误的情况下找到Ticket。
新页面看起来像这样(在我测试功能时非常准确)
<%= 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
The Bookings模型:
belongs_to :event
belongs_to :ticket
has_many :charges
外键关联看起来像这样:
add_reference :bookings, :ticket, index: true
如何解决此错误?
答案 0 :(得分: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 %>
答案 1 :(得分:0)
您需要从new
和create
@ticket = @event.tickets.find(params[:id])
“立即购买”链接
没有传递params[:id]
从new
和create
行动中取出该行,您的错误应该消失