我的Rails路由存在一个奇怪的问题。我有一个名为Page的控制器和一个名为Page#dashboard
的方法[当我尝试访问/ dashboard / 1时,永远不会执行页面控制器的仪表板方法。但令人惊讶的是,/pages/dashboard.html.erb呈现良好。
有人可以解释一下为什么吗?
代码详细信息如下。谢谢
正在尝试访问-/dashboard/1
Routes.rb
match '/dashboard/:id' => 'page#dashboard'
Page_Controller.rb
class PageController < ApplicationController
before_filter :init
private
def init
puts "init getting executed !!!!!!!!!" #this gets printed on console
end
def dashboard
puts "dashboard getting executed !!!!!!!!!" #this doesnt get printed on console
end
end
viewPage-Pages / dashboard.html.erb
日志显示如下-
init getting executed !!!!!!!!!
Started GET "/dashboard/8" for 127.0.0.1 at 2012-06-03 00:04:40 +0800
Processing by PageController#dashboard as HTML
Parameters: {"id"=>"8"}
Rendered page/dashboard.html.erb within layouts/page (45.9ms)
Completed 200 OK in 180ms (Views: 133.6ms | ActiveRecord: 3.1ms)
首先,您不必定义操作方法。如果您只想渲染模板,那么只要模板foo
存在,rails就会很乐意允许您路由到SomeController#foo。
其次,要使一种方法成为一种行动,必须是公开的。您的仪表板方法是私有的,因此它不算作动作,也不会执行。由于您具有dashboard.html.erb模板,因此rails会呈现该模板。
如果您要升级Rails应用并在控制器中具有旧式的'before_filter'调用,则需要将其更改为'before_action'。 “ before_filter”调用将崩溃并绕过控制器,但模板仍将呈现而没有错误。