更新: 感谢您的帮助。我已经能够将这个问题追溯到" order"票证控制器中的操作未触发。这可以解释错误,正如你们中的一些人指出的那样,@ event基本上是零。
我的路线如下:
Rails.application.routes.draw do
get 'tickets', to: 'tickets#index'
post 'order', to: 'tickets#order'
post 'confirmation', to: 'tickets#confirmation'
我已将Index.html.erb页面更新为使用form_tag,因为我没有修改对象,只是想将参数发送到订单操作。
<%= form_tag order_path do %>
<div class="row">
<div class="large-6 columns">Choose Your Tickets:
<%= collection_select(:tickets, :ticket_id, Tickettype.where(event_id: event.id) , :id, :ticketname) %>
</div>
<input type="hidden" value="<%= event.id %>" name="event_id" />
</div>
</div>
<div class="row">
<div class="large-6 columns">Quantity:
<%= select_tag(:ticketqty, options_for_select(["-----Select Quantity-----", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]))%>
</div>
<div class="large-6 columns">
<%= submit_tag "Purchase tickets", class: "alert button" %>
</div>
</div>
<% end %>
任何建议都将不胜感激!
过去几个小时我一直在撞墙,无法弄清楚我做错了什么。
很简单,我的索引页面上有一个表单,它将params传递给&#34; order&#34;页。使用&lt;%= params.inspect%&gt;我可以看到所有内容都按照预期出现在&#34; order&#34;页。当我尝试在我的控制器代码中使用它时,我的问题出现了。
def order
@event = Event.find(params[:event_id])
@tickets = Tickettype.find(params[:tickets][:ticket_id])
end
然后我尝试引用我正在查看我的&#34;命令&#34;页面使用
<%= @event.event_title %>
但它不断抛出以下错误:
ActionView::Template::Error (undefined method `event_title' for nil:NilClass):
10: <div class="large-12 columns">
11: <%= params.inspect %>
12:
13: <%= @event.event_title %>
14: <%= params[:ticketqty] %>
15:
16: </div>
app/views/tickets/order.html.erb:13:in `_app_views_tickets_order_html_erb___998894167849228569_70303636962040'
使用rails控制台,我确认我可以创建一个事件对象,然后显示它的标题
@event = Event.find(16)
@event.event_title
这会打印出预期的标题。毋庸置疑,我仍然坚持为什么我可以从控制台创建对象,但它似乎无法在我的控制器中工作。
非常感谢任何帮助。
以下是我的门票控制器的完整代码:
class TicketsController < ApplicationController
def index
# return next 4 upcoming events
@events = Event.order(event_datetime: :desc).limit(4)
end
def order
@event = Event.find(params[:event_id])
@tickets = Tickettype.find(params[:tickets][:ticket_id])
end
end
这是我的路线档案:
Rails.application.routes.draw do
get 'tickets', to: 'tickets#index'
post 'order', to: 'tickets#order'
post 'confirmation', to: 'tickets#confirmation'
这是索引页面中将参数传递给order.html.erb文件的代码。 INDEX.HTML.ERB
<%= form_for :tickets, :url => { :controller => "tickets", :action => "order" }, html: {method: "post"} do |f| %>
<div class="row">
<div class="large-6 columns">Choose Your Tickets:
<%= f.collection_select(:ticket_id, Tickettype.where(event_id: event.id) , :id, :ticketname) %>
</div>
<input type="hidden" value="<%= event.id %>" name="event_id" />
</div>
</div>
<div class="row">
<div class="large-6 columns">Quantity:
<%= select_tag(:ticketqty, options_for_select(["-----Select Quantity-----", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]))%>
</div>
<div class="large-6 columns">
<%= f.submit "Purchase tickets", class: "alert button" %>
</div>
</div>
<% end %>
这是ORDER.HTML.ERB
<div class="row" style="background-color: #FFFFFF">
<div class="large-12 columns">
<P></P>
<h4 class="page_header">Order Details</h4>
<span class="areatitle-line"></span>
</div>
</div>
<div class="row" style="background-color: #FFFFFF">
<div class="large-12 columns">
<%= params.inspect %>
<%= @event.event_title %>
</div>
</div>
下面是我看到发布到Order.html.erb页面的参数的示例输出。
{"utf8"=>"✓", "authenticity_token"=>"nLEehsQWzrkjXmtX0qEFpkHXGkEMGX3NV6tLjb2HRFAKwwdGtxM028dpclMjukmGIuD4XJk+OTAhw4L9norZPg==", "tickets"=>{"ticket_id"=>"4"}, "event_id"=>"17", "ticketqty"=>"2", "commit"=>"Purchase tickets", "controller"=>"tickets", "action"=>"order"}
答案 0 :(得分:1)
在控制器中,您没有创建对象,而是尝试使用activerecord查找事件记录。
如果找到记录,ActiveRecord将使用记录值创建模型对象。
如果找不到记录,则返回nil。
我的第一个建议是使用
find_by(id: params[:event_id])
而不是find,如果没有找到记录,则find_by将给出nil,但是找到将通过记录找不到异常。
因此,要远离您在视图中遇到的错误,请首先检查条件是否为nil,并仅在@event对象不为nil时显示事件详细信息。
<%= if !@event.nil? %>
答案 1 :(得分:0)
您的order.html.erb上的几个位置您似乎将事件引用为局部变量,而不是您在控制器中定义的实例变量。那是问题吗?
答案 2 :(得分:0)
您正在表单中传递event_id
作为post参数。
因此,期望params[:event_id]
为空是完全合理的。
相反,您应该使用形式的参数:
@event = Event.find(params[:tickets][:event_id])
话虽如此,我希望有一个ActiveRecord::RecordNotFound
例外......也就是说,在获得一个零对象之前....