Rails控制器使用错误的方法

时间:2016-01-29 04:52:10

标签: ruby-on-rails ruby controllers

我正在处理一个给我一些问题的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;但这并没有奏效。知道我可能做错了吗?

5 个答案:

答案 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