2016-05-22 8 views
0

Ich bin neu bei Rails und derzeit baue ich eine Spiele-App. Mein Spiel enthält mehrere Ebenen. Ich möchte, dass die URL des Spiels die Nummer jedes Levels enthält. Zum Beispiel:undefined Methode `_path 'bei Verwendung von Parametern

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

Um dies zu erreichen, ich verstehe, dass ich brauche params zu verwenden, hier ist mein Code:

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 

Controller:

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 

Ansicht:

Jetzt

, wenn ich gehe auf die URL:

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

Rails die Fehler zeigen:

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

Rails zeigen an, dass der Fehler in dieser Zeile in der View-Datei:

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

Bitte zeigen Sie mir, was ich falsch mache und warum diese Methode nicht definiert ist. Danke im Voraus.

+1

Versuchen Sie, diese 'get "/ game1/play /: Ebene"=> "game1 # play", wie:‚game1_play'' – Pavan

+0

vielen Dank Pavan! – Marco

Antwort

2

Wie von Pavan erwähnt, können Sie erzwingen, dass der Pfad mit as: :path_name definiert wird.

Davor würde ich mir meine Routen ansehen, um sicherzustellen, dass alles zu Beginn definiert ist und dass Sie keine unnötigen Routen haben.

Wenn Sie nicht auf REST-basierende Weise mit Ihrem Server kommunizieren müssen, ist es vielleicht eine schlechte Idee, resources zu verwenden, da dies zu internen Fehlern führen wird.

Sie können Ihre Routen mit rake routes überprüfen oder während der Entwicklung gehen Sie zu localhost:port/rails/info/routes.

Auf den ersten Blick würde ich vermuten, dass Ihr Pfad tatsächlich play_game1_path(@game1) ist, mit der Aktion zuerst.

0

Sie verwenden , die Ihnen eine sieben Methoden gibt: Index, neu, erstellen, zeigen, bearbeiten, aktualisieren, zu zerstören. Sie sollten nur diejenigen, geben Sie wie

resources :game1, only: [:index] 

Sie auch nutzen wollen, können Dinge besser organisiert mit verschachtelten Routen von

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

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

Mit diesem Setup machen, werden Sie einen PagesController benötigen. Die Standard-param für Show Routen ist :id

Ressource: http://guides.rubyonrails.org/routing.html

+0

Erstens, nein, du solltest nicht "Ressourcen" verwenden, wie du es vorschlägst. Basierend auf seinen Controllern sollte er "Ressourcen" nicht benutzen. Zweitens ist die Verwendung von 'Ressourcen' für statische Seiten wahnsinnig falsch.Für statische Seiten müssen Sie entweder alles einzeln definieren oder Thoughtbots High Voltage-Juwel verwenden. Drittens hast du nichts wirklich zu diesem Problem beigetragen. – fbelanger

+0

Er könnte definitiv ohne Ressourcen gehen und jede Route angeben. Ich denke, es ist immer besser zu versuchen, wenn möglich, deine Routen RESTful zu machen. Auch die Spielaktion seines Game1Controllers ist dynamisch. – HarlemSquirrel

+1

High Voltage erzeugt einen 'PagesController' und viel mehr nette Sachen. Es wird nicht die anderen Controller entfernen oder sie statisch machen. Und du hast 100% Recht damit, Dinge erholsam zu machen. Ich meine, warum Game1? Es könnte leicht 'ressourcen: games' sein und ein geschachteltes 'resources: levels' haben und einfach' GamesController # show' anstelle von 'play' verwenden. Aber eine Schlacht nach der anderen denke ich. – fbelanger

Verwandte Themen