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 约定