2016-05-22 10 views
0

私はRailsを使い始めましたが、現在私はゲームアプリケーションを構築しています。私のゲームは複数のレベルを含んでいます。私は、ゲームのURLに各レベルの番号が含まれていることを願っています。たとえば:パラメータを使用すると定義されていないメソッド `_path '

routes.rbを::

Rails.application.routes.draw do 

    devise_for :users 

    resources :game1 

    get "/game1" => "game1#index" 
    get "/game1/play/:level" => "game1#play" 
    get "/game1/instruction" => "game1#instruction" 


    get "/pages/*page" => "pages#show" 
    get "/pages/about" => "pages#about" 

    root "pages#show", page: "home" 

end 

コントローラ:

class Game1Controller < ApplicationController 

    def index 
    end 

    def play 

     @game1 = Game1lv.find(params[:level]) 

     @userid = current_user.id 
     @usergame1lv = User.where(id: @userid).limit(1).pluck(:game1lv) 
     if @usergame1lv == [nil] 
      @usergame1lv = 1 
     end 

     @game1l = Game1lv.where(:level => @usergame1lv).limit(1).pluck(:imagelink) 
     @game1a = Game1lv.where(:level => @usergame1lv).limit(1).pluck(:answer) 
     @game1link = @game1l[0].to_s 
     @game1answer = @game1a[0].to_s 

     @game1answer_user = params["answer"] 

     if @game1answer_user == @game1answer 
      redirect_to game1_play_path(@game1), :flash => { :success => "You are right!" } 
     else 
      #flash.now[:alert] = 'You are wrong! Lets try again!' 
     end 

    end 

    def instruction 
    end 

end 

、私は私がのparamsを使用する必要があることを理解し、これを達成するために
http://localhost:3000/game1/play/1 
http://localhost:3000/game1/play/2 

は、ここに私のコードです

ビュー:

私がURLにアクセスしてください。

http://localhost:3000/game1/play/1 

Railsがエラーを示しています。

undefined method `game1_play_path' for #<#<Class:0x943de50>:0x9447720> 

レールのエラーが表示ファイルに次の行にあることを示しています

<%= form_tag game1_play_path(@game1), :method => :get, :id => "text_form" do %> 

私が間違っていること、なぜそのメソッドが定義されていないのかを教えてください。前もって感謝します。

+1

この '取得してみてください「game1_play'' – Pavan

+0

はあなたをとても感謝パヴァン! – Marco

答えて

2

Pavanが述べたように、パスをas: :path_nameを使用して強制的に定義することができます。

これまで、私は自分のルートを見て、まずすべてが定義されていること、そして不必要なルートがないことを確認しました。

サーバーとRESTfulな方法で通信する必要がない場合は、おそらくresourcesを使用することは悪い考えです。内部エラーが発生するためです。

rake routesを使用してルートを確認したり、開発中にlocalhost:port/rails/info/routesに行くことができます。

あなたのパスは実際にはplay_game1_path(@game1)と思われ、アクションが最初です。

0

あなたはresources :game1を使用しています。インデックス、新、作成、表示、編集、更新、破棄の7つの方法があります。あなただけのあなたはまた、この設定で

resources :game1, only: [:index] do 
    get "instruction" 
end 

resources :pages, only: [:show] do 
    get "about" 
end 

により、ネストされたルートで物事をより組織にすることができ、あなたはをPagesControllerが必要になります

resources :game1, only: [:index] 

のような、使用したいものを指定する必要があります。ショーのルートのデフォルトparamがある:idリソース

:として、 "レベル/ game1 /演劇/" => "game1の#遊び":http://guides.rubyonrails.org/routing.html

+0

まず、あなたが提案しているように 'resources'を使用しないでください。彼のコントローラーに基づいて、彼は 'resource 'を全く使用すべきではありません。第二に、静的なページに 'resources'を使うのは間違っています。静的ページでは、すべてを個別に定義するか、ThoughtbotのHigh Voltage gemを使用する必要があります。第三に、あなたは本当にこの問題に何も貢献しませんでした。 – fbelanger

+0

彼は資源を使わずに行くことができ、それぞれのルートを指定することができます。可能であれば、あなたのルートをRESTfulにしようとするのが常に良いような気がします。また、彼のGame1Controllerのプレイアクションはダイナミックです。 – HarlemSquirrel

+1

高電圧は 'PagesController'を作成し、もっと素敵なものを作ります。他のコントローラを削除したり、静的にすることはありません。あなたは物事を穏やかにすることについて100%正しいです。私はなぜGame1をffs意味ですか? 'resources:games'と' resources:levels'をネストし、 'play'の代わりに' GamesController#show'を使うだけです。しかし、私は一度に1つの戦いと思います。 – fbelanger

関連する問題