5

在 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

4 回答 4

5

教程对 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控制器中创建homeandhelp方法。

class StaticPagesController < ApplicationController
  def home
  end

  def help
  end
end

更新- 引用来源:Ruby on Rails 指南 - 第 2.1 节

您听说过 Rails 提倡“约定优于配置”。默认渲染就是一个很好的例子。默认情况下,Rails 中的控制器会自动使用与有效路由对应的名称呈现视图。例如,如果您的 BooksController 类中有此代码:

class BooksController < ApplicationController 
  #empty controller
end 

以及您的路线文件中的以下内容:

resources :books 

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

于 2012-09-26T18:59:58.087 回答
2

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

您可以为high_voltage提供的每个页面自定义布局文件,如自述文件中所述。

于 2012-09-27T19:00:37.977 回答
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。创建视图,瞧。让我知道这是否适合您。

于 2012-09-27T05:02:55.200 回答
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

于 2020-06-18T13:51:03.417 回答