73

查看不同的选项:

一种是将静态页面放在 public/ 文件夹中,但我确实希望布局/应用程序的标题保持一致。

我试过这个,但我得到了一个错误:

# in routes.rb:
map.connect '*path', :controller => 'content', :action => 'show'

# in content_controller.rb:
def show
  render :action => params[:path].join('/')
end

我想要的只是一种简单的方法,只需创建一个 .rhtml,就可以轻松地将我的常见问题、联系人、tos、隐私和其他非应用程序类型的页面放在一起。谁做了这件事?

4

8 回答 8

179

对于Rails6Rails5Rails4 ,您可以执行以下操作:

将下面的行放在 routes.rb 的末尾

  get ':action' => 'static#:action'

然后对root/welcome的请求将呈现/app/views/static/welcome.html.erb

不要忘记创建一个“静态”控制器,即使您不必在其中放置任何东西。

限制:如果有人试图访问一个不存在的页面,它会抛出一个应用程序错误。请参阅下面可以处理 404 的此解决方案

对于Rails3,您必须使用“匹配”而不是“获取”

  match ':action' => 'static#:action'
于 2011-02-11T07:56:49.733 回答
31

thoughtbot 有一个名为 high_voltage 的插件,用于显示静态内容:https ://github.com/thoughtbot/high_voltage

于 2009-11-06T16:46:39.390 回答
22

取决于 url 结构,如果您希望路径脱离 /(例如 /about_us),则:

map.connect ':action', :controller => "static"

这应该在你的路由文件的最后,将你的 .html.erb 文件放入 app/views/static 中,你就完成了。

例如:投入about_us.html.erb, 会给你一个在 /about_us 的页面。

您在问题中拥有的项目非常适合一条包罗万象的路线,您可以在其中分析提供给您的数组params[:path]。更多信息请访问http://railscasts.com/episodes/46-catch-all-route

于 2009-07-19T11:09:26.137 回答
13

渲染一个动作没有意义。您需要使用布局呈现模板(或文件)。

# Path relative to app/views with controller's layout
render :template => params[:path]

# ... OR

# Absolute path. You need to be explicit about rendering with a layout
render :file => params[:path], :layout => true

您可以通过页面缓存从单个操作中提供各种不同的模板。

# app/controllers/static_controller.rb
class StaticController < ApplicationController
  layout 'static'

  caches_page :show

  def show
    valid = %w(static1 static2 static3)
    if valid.include?(params[:path])
      render :template => File.join('static', params[:path])
    else
      render :file   => File.join(Rails.root, 'public', '404.html'), 
             :status => 404
    end
  end
end

最后,我们需要定义一个路由。

# config/routes.rb
map.connect 'static/:path', :controller => 'static', :action => 'show'

尝试访问这些静态页面。如果路径不包含有效模板,我们将渲染 404 文件并返回 404 状态。

  • http://localhost:3000/static/static1
  • http://localhost:3000/static/static3
  • http://localhost:3000/static/static2

如果您查看 app/public,您会注意到一个包含 static1.html、static2.html 和 static3.html 的 static/ 目录。在第一次访问页面后,由于页面缓存,任何后续请求都将完全是静态的。

于 2009-07-18T04:26:17.173 回答
3

我从给出的答案中使用了通用控制器的想法,但我想捕捉 404,所以我在其中放置了一个动作来处理这两种情况:

# app/controllers/static_controller.rb
class StaticController < ApplicationController
    def static_or_404
        render params[:static]
    rescue ActionView::MissingTemplate
        render :not_found
    end
end

然后在我的路由的最底部:

# config/routes.rb
get '*static', to: 'static#static_or_404'

它提供与app/views/static路径同名的视图,如果没有这样的视图,它提供app/views/static/not_found.html.erb. 人们也可以render :not_foundredirect_to root_path其他任何想要发生的事情来代替。

于 2020-01-24T20:07:03.267 回答
2

考虑到您是否有 1 个家庭控制器,其中包含 show、aboutus、privacy 等几种方法:

class HomesController < ApplicationController
  def show
  end
  def privacy
  end
  def aboutus
  end
end

并将 show 方法映射到您的根,并将另一个映射到一些命名路由,例如

map.root      :controller => "homes", :action => "show"
map.aboutus "/aboutus", :controller => "homes", :action => "aboutus"
map.privacy "/privacy", :controller => "homes", :action => "privacy"

并为每个

app/views/homes/aboutus.html.erb --> you get http://localhost:3000/aboutus
app/views/homes/show.html.erb --> you get http://localhost:3000 (root)
app/views/homes/privacy.html.erb --> you get http://localhost:3000/privacy

都在 app/views/layout/application.html.erb 使用相同的布局

于 2009-07-18T10:28:45.147 回答
2

Lindsaar解决方案是我见过的最好的解决方案之一。他构建了一个缓存静态页面,当 git 修订版更改时会过期。

<%= cache "site-page-#{@page_name}-#{App.git_revision}" do %>
  <%= render :partial => @page_name %>
<% end %>
于 2012-11-04T09:40:18.810 回答
1

为您的静态页面(例如联系人)创建一个 PagesController 并插入

def contact_page
end

在 config/routes.rb 中插入

get 'contact' => 'pages#contact_page'

这将显示来自views/pages/contact_page.html.erb的内容

于 2015-04-27T16:00:49.313 回答