ActionView :: Template :: Error(未定义的方法`event_title' for nil:NilClass)

时间:2016-07-10 20:34:57

标签: ruby-on-rails

更新: 感谢您的帮助。我已经能够将这个问题追溯到" 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"}

3 个答案:

答案 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例外......也就是说,在获得一个零对象之前....