【问题标题】:Rails view path not being resetRails 视图路径未重置
【发布时间】:2016-08-16 00:32:00
【问题描述】:

给定 Rails 4.2,Ruby 2.3.1。

理论上,Rails 应该允许您完全重置视图路径,如 here, in the source code 所示。

但是,当我通过控制器回调通过 #view_paths= 重置 view_paths 时,发生了一些意想不到的事情。

> view_paths.size
=> 2
> new_paths = view_paths.reject { |vp| rejection criteria }
> new_paths.size
=> 1
> view_paths = new_paths
> view_paths.size
=> 2
> _view_paths.size
=> 1

self._view_paths 已成功重置,但#view_paths 并未接受这些更改,尽管simply being a wrapper for self._view_paths。为什么self._view_paths 正确,而#view_paths 不正确?

注意:这很重要,因为 Rails 在搜索视图时使用 #view_paths,而不是 self._view_paths

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 ruby-2.3


    【解决方案1】:

    尝试改变

    view_paths = new_paths
    

    self.view_paths = new_paths
    

    view_paths = new_paths 很可能正在初始化一个名为 view_paths 的局部变量,而不是调用方法 view_paths=

    编辑:

    由于您获得的是NoMethodError,因此您不在您认为的上下文中,因为在您发布的https://github.com/rails/rails/blob/ec28c4fb242a9bf0632bb4dac0d0a2d949eab1b3/actionpack/lib/abstract_controller/view_paths.rb#L91 文件中有一个具有该名称的方法

    【讨论】:

    • self.view_paths = new_paths throws NoMethodError: undefined method 'view_paths='
    • 那么这应该告诉你你不在你认为你所处的上下文中,因为在你发布的文件中有一个具有该名称的方法github.com/rails/rails/blob/…
    • 对上下文的好调用。如果您更新答案,我可以将我的反对更改为赞成。 (所以锁定了我改变我的投票)
    • @steel 如果这解决了您的问题,您介意将其标记为答案吗?如果没有,请告诉我您缺少什么。
    • 建议的答案会引发错误。我能够使用我添加的另一种策略作为答案。
    【解决方案2】:

    看起来一旦创建了控制器实例,视图路径就从lookup_context 访问,这就是它需要更改的地方。

     lookup_context.view_paths.paths.reject! { |vp| rejection criteria }
    

    【讨论】:

      猜你喜欢
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      • 1970-01-01
      相关资源
      最近更新 更多