在rails中处理嵌套静态页面的最佳方法是什么?

时间:2011-12-27 11:06:10

标签: ruby-on-rails ruby ruby-on-rails-3.1

编辑:对不起,标题有点不清楚,我想用半静电'页面,使用渲染助手和红宝石变种。 ERB模板系统等对不起伙计!我的错!

我一直在考虑为我建立的rails 3.1.3应用程序创建嵌套的半静态页面,而且我还没有找到适合我所有需求的答案。有什么想法吗?

我遇到的所有解决方案都是关于创建只是顶级网页,如下所示:

- Site root
--- About (http://wwww.example.com/about)
--- Contact (http://wwww.example.com/contact)
--- Products (http://wwww.example.com/products)
--- Pricing (http://wwww.example.com/pricing

而我正在寻找像

这样的事情
- Site root
--- About (http://wwww.example.com/about)
------ What we do (http://wwww.example.com/about/what-we-do)
------ Another sub-page (http://wwww.example.com/about/another-sub-page)
--- Contact (http://wwww.example.com/contact)
--- Products (http://wwww.example.com/products)
------ Product One (http://wwww.example.com/products/product-one)
------ Product Two (http://wwww.example.com/products/product-two)
--- Pricing (http://wwww.example.com/pricing)

我遇到了为每个页面映射静态控制器等解决方案,但这看起来并不是一个特别优雅的解决方案。

或者创建一个通用路由和控制器来匹配请求,如下所示:

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

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

但这似乎更不优雅,还有另外一种我失踪的方式吗?

4 个答案:

答案 0 :(得分:3)

  

我还有另一种方法吗?

您所要做的就是在/public,的根目录public或目录结构中创建静态页面。

/public下的路径中存在的物理文件应覆盖您为动态生成的页面配置的任何路由。

答案 1 :(得分:1)

DanSingerman说了什么,但也......只是把你的静态页面放在一个单独的fqdn上,可能是在cdn上托管的。让rails服务于静态资产的唯一原因是你是懒惰的,只是不能以正确的方式去做。

答案 2 :(得分:1)

我遇到了静态子页面的类似问题,提出了以下解决方案。

在routes.rb

match 'about/(:page)', :to => 'about#show', as: 'about'
match 'about/what-we-do', :to => 'about#show', as: 'what_we_do'

在about_controller.rb

class AboutController < ApplicationController
  def show
    unless params[:page].blank?
      render "about/#{params[:page].underscore}"
    end
  end
end

在您的视图中,您可以引用别名路径。

<%= link_to 'About', about_path %>
<%= link_to 'What We Do', what_we_do_path %>

因此/about默认会呈现视图about.html.erb

/about/what-we-do会呈现视图about/what_we_do.html.erb

这样的事情有助于解决您的问题吗?

答案 3 :(得分:0)

事实上,大多数CMS都是这样做的。如果您觉得自己正在做很多繁重的工作,请尝试将像Refinery这样的CMS插入到您的应用中。它通过照顾一些SEO方面使生活变得更简单。如果您对Refinery CMS如何处理其网页感兴趣,请查看Pages Controller以及相关的routesmagic match all route