使用布局文件在Rails中提供静态HTML

时间:2012-09-26 18:48:51

标签: html ruby-on-rails ruby-on-rails-3 layout ruby-on-rails-3.2

使用布局在Rails中提供静态HTML文档的最佳方法是什么?显然我可以将HTML文件保存在public/目录中,但是我无法应用布局,或者我可以吗?否则我可以在config/routes.rb中添加以下内容:

match ':page' => 'static#display', :page => /.+\.html/

.+\.html是否正常工作,以.html结尾?无论如何,假设它确实如此,我想我有一个控制器:

class StaticController < ApplicationController
  layout 'static_files'
  def display
    render params[:page]
  end
end

假设工作正常,Ruby是否会不必要地尝试将HTML文件解析为ERB文件? Rails有更好的机制吗?

4 个答案:

答案 0 :(得分:5)

这个tutorial对rails中的静态页面有很好的解释。

首先,您可以通过rails生成器生成静态页面:

rails generate controller StaticPages home help --no-test-framework

然后,您可以修改config/routes.rb,如下所示:

SampleApp::Application.routes.draw do
  root to: 'static_pages#home'
  match '/help',    to: 'static_pages#help'
  .
  .
  .
end

最后在您的StaticPages控制器中,您可以创建homehelp方法。

class StaticPagesController < ApplicationController
  def home
  end

  def help
  end
end

更新 - quote source: Ruby on Rails Guides - Section 2.1

  

你听说Rails推广“约定优于配置”。   默认渲染就是一个很好的例子。默认情况下,   Rails中的控制器自动呈现名称为的视图   对应有效路线。例如,如果您的代码中包含此代码   BooksController类:

class BooksController < ApplicationController 
  #empty controller
end 

以下路线文件:

resources :books 

如果你有一个视图文件app/views/books/index.html.erb,那么即使没有方法,Rails也会渲染它。这适用于任何映射的路由/等效视图。

答案 1 :(得分:2)

您可以使用Thoughtbot的high_voltage gem。它的目的是在Rails中包含静态页面,并使用您喜欢的任何模板语言。在内部,它与此处提出的解决方案类似。

您可以自定义high_voltage服务的每个页面的布局文件,如自述文件中的here所述。

答案 2 :(得分:0)

创建一个处理静态页面的控制器

rails generate controller pages

将路线映射到routes.rb

中的这些操作
match '/home' => 'pages#home'
match '/help' => 'pages#help'
match '/contact' => 'pages#contact'

在页面控制器中创建操作

def home
CODE
end

def contact
CODE
end

def help
CODE
end

默认情况下,rails会在视图文件夹中查找ACTION.html.erb。创建视图和瞧。如果这对您有用,请告诉我。

答案 3 :(得分:0)

我不想在页面控制器中为我的85个静态HTML页面创建85个方法。

这似乎有些破烂,但确实可以满足您的要求:

# File: app/controllers/static_controller.rb

class StaticController < ApplicationController
  def method_missing(m, *args, &block)
  end
end

现在将某些内容放置在正确的目录下,例如app/views/static/example.html.erb,并路由到该目录:

get '/example', to: 'static#example'

您并未真正定义一个名为method_missing的动作,而是一个带有黑魔法的动作。有相关文档:https://ruby-doc.org/core-2.7.1/BasicObject.html#method-i-method_missing