如何在 Rails 中做静态内容?

看看不同的选择:

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

我试过了,但是出错了:

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


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

所有我想要的是一个简单的方法,把我的常见问题,联系人,托斯,隐私,和其他非应用程序类型的网页放在一起,只要创建一个容易的地方。Rhtml.谁干的?

57841 次浏览

呈现一个动作是没有意义的。您需要呈现一个带有布局的模板(或文件)。

# 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/目录。在第一次访问页面之后,由于页面缓存,任何后续请求都将是完全静态的。

考虑如果你有一个家庭控制器与夫妇的方法,如显示,关于我们,隐私:

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/layation.html. erb

取决于 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有更多关于这方面的信息

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

对于 轨道6铁轨5铁轨4,你可以做到以下几点:

把下面的线放在路线的尽头

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

然后请求 根/欢迎,将呈现 /app/views/static/Welcome e.html. erb

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

限制: 如果有人试图访问一个不存在的页面,它将抛出一个应用程序错误

对于 铁轨3,你必须使用‘ match’而不是‘ get’

  match ':action' => 'static#:action'

为静态页面(如联系人)创建 PagesController 并插入

def contact_page
end

在 config/routes.rb 中插入

get 'contact' => 'pages#contact_page'

它将显示 views/pages/contact _ page.html. erb 中的内容

我根据给出的答案使用了广义控制器的概念,但是我想捕捉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。你也可以用 redirect_to root_path或者任何你想要发生的事情来代替 render :not_found