如何在Rails中做静态内容?

Tim*_* T. 72 ruby ruby-on-rails static-content

看看不同的选择:

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

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

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

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

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

Rol*_*der 178

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

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

  get ':action' => 'static#:action'
Run Code Online (Sandbox Code Playgroud)

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

不要忘记创建一个"静态"控制器,即使你不必在那里放任何东西.

对于Rails3,你必须使用'match'而不是'get'

  match ':action' => 'static#:action'
Run Code Online (Sandbox Code Playgroud)

  • 如果有人想知道,这里的":行动"是神奇的; 如果你称它为":id"或":title"或其他什么,它将无法工作. (14认同)
  • +1真棒,正是我需要的.这应该得到更多的投票,因为它是最新的Rails. (4认同)
  • 如何避免异常,因为这是一个全能的?理想情况下,您想要提供404,而不是触发异常.我试图找到这是如何记录的,它没有触发丢失的方法,它只是在磁盘上查找视图. (2认同)

Gab*_*esy 30

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


Oma*_*shi 22

取决于url结构,如果你想要路径离开/(例如/ about_us),那么:

map.connect ':action', :controller => "static"
Run Code Online (Sandbox Code Playgroud)

这应该在你的路径文件的最后,将你的.html.erb文件扔到app/views/static中,你就完成了.

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

你问题中的项目非常适合捕捉所有路线,你可以分析给你的阵列params[:path].有关详细信息,请访问http://railscasts.com/episodes/46-catch-all-route


Tat*_*son 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
Run Code Online (Sandbox Code Playgroud)

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

# 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
Run Code Online (Sandbox Code Playgroud)

最后,我们需要定义一条路线.

# config/routes.rb
map.connect 'static/:path', :controller => 'static', :action => 'show'
Run Code Online (Sandbox Code Playgroud)

尝试访问这些静态页面.如果路径不包含有效模板,我们将呈现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的静态/目录.在第一次访问页面后,由于页面缓存,任何后续请求都将完全静态.