我是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 %>
请告诉我我做错了什么以及为什么这个方法未定义。提前致谢。
答案 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