2016-07-10 8 views
0

更新日: ありがとうございました。私はこの問題をTicketsコントローラの "order"アクションが発砲していないという事実に戻って追跡することができました。これはエラーを説明し、あなたが指摘しているように、@eventは基本的にnilです。次のようにActionView :: Template :: Error(未定義メソッド `event_title 'for nil:NilClass)

私のルートは以下のとおりです。

Rails.application.routes.draw do  

     get 'tickets', to: 'tickets#index' 
     post 'order', to: 'tickets#order' 
     post 'confirmation', to: 'tickets#confirmation' 

私は、オブジェクトを変更していないよので、代わりにform_tag使用するIndex.html.erbページを更新し、単に順番にパラメータを送信したいましたアクション。

<%= 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を "order"ページに渡すフォームを持っています。 <%= params.inspect%>を使用すると、「注文」ページにすべてが表示されます。私の問題は、コントローラコードでそれらを使用しようとすると発生します。使用

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' 

def order 
    @event = Event.find(params[:event_id]) 
    @tickets = Tickettype.find(params[:tickets][:ticket_id]) 
end 

私はその後、私は

<%= @event.event_title %> 

を使用して、私の「注文」ページにアップしているよ、それは次のエラーを投げ続けるイベントを参照しようrails console、イベントオブジェクトを作成してタイトルを表示できることを確認しました

@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

tickets_controllerの全コンテンツとルートを貼り付けることはできますか? – oreoluwa

+0

この情報を掲載するように投稿を更新しました。前もって感謝します。 –

+0

チケットコントローラのインデックスアクションで@eventを定義するとどうなりますか? – Ren

答えて

0

あなたのorder.htmlのいくつかの場所。あなたは、イベントをローカル変数として参照するように見えますが、コントローラで定義したように、インスタンス変数としてではありません。それは問題ですか?

0

投稿パラメータとしてevent_idをフォームに渡しています。

したがって、params[:event_id]がnullであると期待するのは理にかなっています。

代わりに、フォームからパラメータを使用する必要があります。私がnilオブジェクトを取得する前に...つまり、ActiveRecord::RecordNotFound例外を期待する、と述べた

@event = Event.find(params[:tickets][:event_id]) 

....

1

コントローラでは、オブジェクトを作成せず、activerecordを使用してイベントレコードを検索しようとしました。

レコードが見つかった場合、レコード値を使用してモデルオブジェクトを作成します。

レコードが見つからない場合は、nilが返されます。 find_byはレコードが見つからない場合はnilを与えるが、レコードを通じて例外を見つけませんでしょうとして、あなたのために

私の最初の提案は

find_by(id: params[:event_id]) 

を使用するのではなく見つけることになります。

エラーが表示されている状態から脱出するには、まずイベントがnilかどうかをチェックし、@eventオブジェクトがnilでない場合にのみイベントの詳細を表示します。

 <%= if [email protected]? %> 
関連する問題