使用params时未定义的方法`_path'

时间:2016-05-22 11:57:40

标签: ruby-on-rails ruby ruby-on-rails-3

我是Rails的新手,目前我正在构建一款游戏应用。我的游戏包含多个级别。我希望游戏的网址包含每个级别的数量。例如:

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

为了达到这个目的,我明白我需要使用params,这是我的代码:

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

视图:

<body><center>

    <br><b>Answer: </b><br><br>

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

        <%= text_field_tag "answer", "" ,class: 'textbox_game' %>
        <br><br>
        <%= submit_tag("Submit", :class => "button_game") %>

    <% end %>


</center></body>

现在我去了网址:

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

Rails显示错误:

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

Rails指示错误位于视图文件中的此行:

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

请告诉我我做错了什么以及为什么这个方法未定义。提前致谢。

2 个答案:

答案 0 :(得分:2)

如Pavan所述,您可以使用as: :path_name强制路径定义。

在此之前,我会查看我的路线,确保所有内容都定义为开头,并且您没有不必要的路线。

如果您不需要以RESTful方式与服务器通信,那么使用resources可能不是一个坏主意,因为这会导致内部错误。

您可以使用rake routes检查路线,或者在开发过程中,您可以转到localhost:port/rails/info/routes

乍一看,我怀疑你的路径实际上是play_game1_path(@game1),首先是行动。

答案 1 :(得分:0)

您正在使用resources :game1,它为您提供了七种方法:索引,新建,创建,显示,编辑,更新,销毁。您应该只指定要使用的那些,如

resources :game1, only: [:index]

您还可以通过

使用嵌套路线使事情更有条理
resources :game1, only: [:index] do
  get "instruction"
end

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

使用此设置,您将需要一个PagesController。 show routes的默认参数是:id

资源:http://guides.rubyonrails.org/routing.html