Rails 控制器使用了错误的方法
Rails controller using wrong method
我正在做一个 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 为 "new" 的角色,但效果不佳。知道我可能做错了什么吗?
只需使用
resources :characters, :path => "characters"
在你的routes.rb
Rails 按顺序解析路由,因此它将 'new' 视为 characters/:id
路由(首先遇到)的 :id
。
只需交换路由顺序如下:
get 'characters/new', to: 'characters#new'
get 'characters/:id', to: 'characters#view'
routes.rb中的顺序很重要,路由器将找到匹配的第一条路由。
在您的情况下,它永远不会转到 characters#new
,因为它上面的行将始终匹配。
一个简单的解决方案是交换两条线。
更好的解决方案可能是使用 resource routing as documented in the Rails routing guide。
如果在您的 routes.rb 中使用此命令,对于 /character/new
请求,rails 将理解该请求由 view
操作处理 paramas[:id] = 'new'
让characters/new
在对方解决你的问题之前:
get 'characters/new', to: 'characters#new'
get 'characters/:id', to: 'characters#view'
尽量使用足智多谋的路线,更干净:
resources :characters, only: [:new, :show]
我还建议将 def view
重命名为 def show
以遵循 rails 约定
我正在做一个 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 为 "new" 的角色,但效果不佳。知道我可能做错了什么吗?
只需使用
resources :characters, :path => "characters"
在你的routes.rb
Rails 按顺序解析路由,因此它将 'new' 视为 characters/:id
路由(首先遇到)的 :id
。
只需交换路由顺序如下:
get 'characters/new', to: 'characters#new'
get 'characters/:id', to: 'characters#view'
routes.rb中的顺序很重要,路由器将找到匹配的第一条路由。
在您的情况下,它永远不会转到 characters#new
,因为它上面的行将始终匹配。
一个简单的解决方案是交换两条线。
更好的解决方案可能是使用 resource routing as documented in the Rails routing guide。
如果在您的 routes.rb 中使用此命令,对于 /character/new
请求,rails 将理解该请求由 view
操作处理 paramas[:id] = 'new'
让characters/new
在对方解决你的问题之前:
get 'characters/new', to: 'characters#new'
get 'characters/:id', to: 'characters#view'
尽量使用足智多谋的路线,更干净:
resources :characters, only: [:new, :show]
我还建议将 def view
重命名为 def show
以遵循 rails 约定