【问题标题】:Custom variable in Rails view filenameRails 视图文件名中的自定义变量
【发布时间】:2012-08-25 14:43:48
【问题描述】:

默认情况下,Rails 可以在文件名中找到具有格式、区域设置和模板语言的视图(所以我可以创建 index.de.json.erb

是否可以在视图的文件名中添加另一个自定义参数?

我想传递当前子域,所以http://foo.example.com/ 将呈现index.foo.html.erbhttp://bar.example.com/ 将呈现index.bar.html.erb(它们都带有index.html.erb 后备)。

【问题讨论】:

    标签: ruby-on-rails actionview


    【解决方案1】:

    用于查找视图的解析模式只能包含在ActionView::LookupContext 类中注册的变量。因此,第一步是向LookupContext 类注册一个新变量(subdomain)。您应该在初始化程序中执行此操作:

    ActionView::LookupContext.register_detail(:subdomain) do
      ['default_subdomain']
    end
    

    现在LookupContext 知道subdomain,它可以包含在解析模式中。有关更改解析模式的更多详细信息,请参阅ActionView::FileSystemResolver documentation,但基本上您应该在初始化程序中包含以下内容:

    ActionController::Base.view_paths = ActionView::FileSystemResolver.new(
      Rails.root.join('app', 'views'),
      ':prefix/:action{.:locale,}{.:subdomain,}{.:formats,}{.:handlers,}'
    )
    

    这个模式最终被传递给Dir.glob(在:*变量被替换之后)。 glob 模式{.:subdomain,} 表示“要么.:subdomain 要么什么都没有”,如果找不到具有子域的文件,它会提供回退到没有子域的视图文件。

    最后一步是更新您的ApplicationController 以将子域传递给LookupContext

    class ApplicationController < ActionController::Base
      def details_for_lookup
        {:subdomain => [request.subdomain]}
      end
    end
    

    (这个答案主要是通过阅读源代码得出的,其中一些功能没有记录。它是用 Rails 3.2.5 测试的)

    【讨论】:

    • 很高兴我能提供帮助,欢迎来到 Stack Overflow。如果答案解决了您的问题,您应该将其标记为已接受,更多关于如何以及为什么在这里的信息:meta.stackexchange.com/a/5235
    【解决方案2】:

    我认为您在这里不需要自定义处理程序。您无需对模板执行某些预置操作,但您只需要使您的模板成为特定于域的模板。

    我会考虑做这样的事情:

    # in ApplicationController:
      before_filter :set_view_paths
    
      def set_view_paths
        self.class.view_paths = Rails.root.join('app', 'views', controller_name, request.subdomain)
      end
    

    然后,您必须将 foo 域的模板放入每个 views/controller_name 路径的 foo 文件夹中。

    还要检查append/prepend_view_path documentation 以允许在没有域视图的情况下使用默认值。

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多