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

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

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

共收到 4 条回复

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的基本结构了

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