我的Rails路线总是会显示动作

时间:2015-09-22 12:43:45

标签: ruby-on-rails rails-routing

我在Rails项目中有以下路线

resources :custom_urls, :path => '', :only => [:show, :new, :create]

我的路线适用于shownewcreate行动。但是,当我去其他路径时,例如

localhost:3000/index

它总是显示页面。由于这个原因,我收到错误,因为我没有设置show action中的实例变量。我该如何避免这个问题?当我尝试去其他路线时,我想得到404。我只希望我的应用程序路由到shownewcreate操作。

提前致谢。

Upate

以下是我的路线

 Prefix Verb URI Pattern    Controller#Action
      root GET  /              custom_urls#new
custom_urls POST /              custom_urls#create
new_custom_url GET  /new(.:format) custom_urls#new
custom_url GET  /:id(.:format) custom_urls#show

2 个答案:

答案 0 :(得分:1)

您的解决方案没有任何问题,您只是受到Rails行为的一点点欺骗。发生了什么事情,因为您在访问以下网址时将:custom_urls的默认路径路径更改为"":

localhost:3000/index

服务器将其视为

localhost:3000/custom_urls/index

所以它首先要寻找一个名为" index"在你的控制器上。既然你没有声明它并指明这条路线在你的route.rb中确实不存在,那么对于rails来说,下一个逻辑步骤就是思考"索引"作为类" Custom_url"的对象的ID,因此它触发show动作导致错误。

基本上这种逻辑会发生在你输入​​的任何内容上:

localhost:3000/XXXX

或者,如果你改变routes.rb

localhost:3000/custom_urls/XXXX

我不建议执行以下步骤,但如果您确实要将/ index重定向到404,则需要在路径中创建操作

resources :custom_urls, :path => '', :only => [:show, :new, :create, :index]

然后在CustumUrlsController中创建动作" index"重定向到404错误

def index
  raise ActionController::RoutingError.new('Not Found')
end

答案 1 :(得分:0)

您是否收到ActiveRecord :: RecordNotFound异常?如果是这样,它按预期工作。在开发中,它显示了webconsole,在生产中它将显示public / 404.html。

顺便问一下,用户如何访问localhost:3000 / index页面?您的应用是否有带/ index的菜单项?

如果您仔细观察rake路线,localhost:3000 / blah(当blah不是新的时候)与告诉你的应用找到我的id_ blal custom_url相同。在这种情况下,blah是索引。它可以是任何东西,如果它是一个有效的id,它将获取记录。 localhost:3000 / new优先于localhost:3000 / notnew。