嵌套资源 - 没有方法错误

时间:2014-07-22 13:07:41

标签: ruby-on-rails ruby

我使用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

如何解决此错误?

2 个答案:

答案 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)

您需要从newcreate

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

“立即购买”链接

没有传递params[:id]

newcreate行动中取出该行,您的错误应该消失