我正在处理一个给我一些问题的Rails项目。我有一个控制器characters_controller.rb
有两种方法。
class CharactersController < ApplicationController
before_action :authenticate_player!
def view
@character = Character.find(params[:id])
unless @character.player_id == current_player.id
redirect_to :root
end
end
def new
end
end
我为每个人设置了路线。
get 'characters/:id', to: 'characters#view'
get 'characters/new', to: 'characters#new'
第一条路线工作正常。我可以转到/ characters / 1,然后我会显示相应的视图和请求的信息。如果我访问/ characters / new,我会显示一个引用字符#view的错误。
raise RecordNotFound, "Couldn't find #{name} with '#{primary_key}'=#{id}"
和
app/controllers/characters_controller.rb:6:in `view'
所以/ characters / new试图从数据库中获取一个ID为&#34; new&#34;但这并没有奏效。知道我可能做错了吗?
答案 0 :(得分:6)
在routes.rb中,订单很重要,路由器将找到匹配的第一条路线。
在您的情况下,它永远不会转到characters#new
,因为它上面的行始终匹配。
一个简单的解决方案是交换这两行。
更好的解决方案可能是使用resource routing as documented in the Rails routing guide。
答案 1 :(得分:2)
Rails按顺序解析路由,因此它正在考虑新的&#39;作为:id
路由的characters/:id
(首先遇到)。
按照以下方式交换路线顺序:
get 'characters/new', to: 'characters#new'
get 'characters/:id', to: 'characters#view'
答案 2 :(得分:1)
如果您在routes.rb中使用此订单,对于/character/new
请求,rails会理解该请求是由view
操作paramas[:id] = 'new'
处理的
让characters/new
在另一个之前解决您的问题:
get 'characters/new', to: 'characters#new'
get 'characters/:id', to: 'characters#view'
答案 3 :(得分:1)
尝试使用资源丰富的路线,更清洁:
resources :characters, only: [:new, :show]
另外,我建议将def view
重命名为def show
以遵循rails约定
答案 4 :(得分:-1)
只需使用
resources :characters, :path => "characters"
在routes.rb