【问题标题】:Can I Render A Layout Directly From routes.rb, Without A Controller?我可以在没有控制器的情况下直接从 routes.rb 渲染布局吗?
【发布时间】:2014-09-18 20:46:14
【问题描述】:

我想为网站的管理和公共部分设置一对样式指南。

每个都需要自己的布局,其中包含静态 html 和对 erb 部分调用的混合(因此静态页面不会削减它)。我不需要控制器来为这些页面提供服务,而且我不希望有效地仅用于开发的内容使其余代码混乱。这让我想知道是否有办法直接渲染布局。

免责声明:我明白这不是我应该经常/永远做的事情,我知道有很多论据说明为什么这是一个坏主意。我对这是否可能感兴趣。

有没有办法让我直接从 routes.rb 渲染布局而不通过控制器?

【问题讨论】:

  • @jvnill 我的组件样式部分都是通过本地配置的,所以我可以将虚拟数据传递给它们。他们不使用控制器变量。大部分布局是静态的。
  • 抱歉,删除了我的评论,因为我认为您删除了问题中的 erb 部分。在任何情况下,路由只是将 url 与控制器操作匹配的一种方式。我不确定我是否理解为什么不需要控制器。即使你在渲染局部变量时使用局部变量,你从哪里调用render
  • @jvnill 这就是我的问题的重点。我对是否有一种无需控制器即可渲染它的方法感兴趣。也许答案是不可能,但我对它是否是感兴趣。
  • 是的,我认为没有。这不仅仅是关于布局。如果内容不是静态的,则必须通过控制器或使用@Зелёный 的答案并使用 ERB 绑定,但这基本上是控制器所做的。
  • 在没有对应控制器的情况下发出请求会得到一个未初始化的常量错误。

标签: ruby-on-rails ruby layout ruby-on-rails-4 routing


【解决方案1】:

其实答案是NO,没有控制器是做不到的。但是看看一些简单的解决方法......

这不是很公平,但应该可以:

假设您有 FooController 以及您已经实现的任何逻辑。现在你想在不创建任何特殊控制器的情况下渲染anypage.html.erb。方法如下:


  1. 配置到静态页面的路由:

    get '/your/static/page', to: 'foo#anypage'

  2. 实现视图app/views/foo/anypage.html.erb


问题是无法更改视图的路径。路径取决于您在路由中指定的控制器(示例中为foo)。另请注意,它将使用为FooController 指定的布局呈现。

它应该按照惯例工作,你可以阅读它here


更新

我还发现了非常相似的解决方案here。对于此类页面,使用 ApplicationController 似乎更合理。 (请注意,您无需为其创建操作

【讨论】:

    【解决方案2】:

    我曾经想做一些非常愚蠢的事情,所以如果你也这样做,试试这个工作示例。

    match :movedpage, :to => proc { |env|
        if Rails.env.production?
            @remote_path = 'http://productionhost.com'
        elsif Rails.env.staging?
            @remote_path = 'http://staginghost.com'
        else
            @remote_path = 'http://localhost:3000'
        end
        [
            200,
            {"Content-Type" => "text/html"},
            [File.read("public/moved_page.html").gsub('@remote_path', @remote_path)]
        ]
    }, :via => :all
    

    moved_pa​​ge.html 是一个静态页面,要求人们更新他们的书签,@remote_path 只是输入了一个类似<a href="@remote_path">@remote_path</a> 的链接。请注意,<%= %> 将不起作用,因为其中没有视图助手。

    所以,有足够的绳索让自己陷入困境^_^

    【讨论】:

      【解决方案3】:

      出于某种奇怪的原因,我想暂时渲染一个空白的 JS 文件,而编写控制器对于这种 hack 来说感觉太多了。感谢@genkilabs 的回答,我使用了这个 3 班轮:

      get 'analytics/some_file.js', to: -> (env) do
        [200, { 'Content-Type' => 'application/javascript' }, ['']]
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多