我在Rails项目中有以下路线
resources :custom_urls, :path => '', :only => [:show, :new, :create]
我的路线适用于show
,new
和create
行动。但是,当我去其他路径时,例如
localhost:3000/index
它总是显示页面。由于这个原因,我收到错误,因为我没有设置show action中的实例变量。我该如何避免这个问题?当我尝试去其他路线时,我想得到404。我只希望我的应用程序路由到show
,new
和create
操作。
提前致谢。
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
答案 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。