Rails controller_name 可以在 View 中使用,这是怎么来的?

chengkai1853 · 2015年08月05日 · 最后由 chengkai1853 回复于 2015年08月12日 · 2494 次阅读

例如,在 view 中可以用 controller_name 获得 controller 的名称,我进入http://api.rubyonrails.org 查询 controller_name,获得的结果如下 发现它 ActionController::Metal < AbstractController::Base 的方法,应该 controller 里面的方法不能直接在 view 中使用,helper 的方法可以,但是 controller_name 可以在 view 中使用。请问大大们,这个怎么理解?

viewerb模型,属ActionViewcontroller_nameActionView::Helpers::ControllerHelper里有定义,具体清查此处

这是为什么controller_name能在view里被调用

其实就是有个 Helper 里定义了 Delegation,把 Controller 里的一些方法都 delegate 到 View Helper 里。

delegate :request_forgery_protection_token, :params, :session, :cookies, :response, :headers,
               :flash, :action_name, :controller_name, :controller_path, :to => :controller

ref https://github.com/rails/rails/blob/4-2-stable/actionview/lib/action_view/helpers/controller_helper.rb

如果你要问为什么这里会拿到 controller,原因是 view 和 controller 互相持有引用,并且 view 的上下文就是由 controller 决定的,所以你能拿到 controller 里设置的实例变量。

实际上要取到 Controller 的名字也可以通过 params[:controller] 来拿到,这个是由路由产生的,同时可以拿到的还有 params[:action]

理解了 MVC 的 data flow 图就明白了。

#2 楼 @_kaichen 非常感谢大大的讲解,看来要多熟悉 rails 的基本结构了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号