Ruby on Rails中的静态页面


76

制作具有如下页面的Ruby on Rails应用程序的标准方法是什么?

  • 关于
  • 联系

我会问别人是否有链接或答案,而不是仅仅说使用gem,因为我想学习如何制作具有这种行为的简单webapp。

Answers:


113

取决于您要如何处理这些页面中的内容。

方法#1-在视图中存储内容

如果您只想将所有内容放入ERB视图中,那么一种非常简单的方法是创建PagesController其目的是处理静态页面。每个页面由控制器中的一个动作表示。

pages_controller.rb:

class PagesController < ApplicationController
  def home
  end

  def about
  end

  def contact
  end
end

route.rb:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'

然后在app / views / pages下创建home.html.erb,about.html.erb和contact.html.erb视图。这些视图包含您希望在静态页面上显示的所有内容。默认情况下,它们将使用您应用程序的application.html.erb布局。

您还需要研究页面缓存,以提高性能。


方法#2-将内容存储在数据库中

我使用的另一种方法是为静态页面制作一个非常基本的CMS。在这种情况下,页面在模型中表示。它使用friendly_id gem来处理每个页面的段,以便可以通过URL中的漂亮名称(例如,/ about)而不是ID来检索它们。

page.rb:

class Page < ActiveRecord::Base
  attr_accessible :title, :content

  validates_presence_of :title, :content

  has_friendly_id :title, :use_slug => true, :approximate_ascii => true
end

pages_controller.rb:

class PagesController < ApplicationController
  def show
    @page = Page.find(params[:id])
    render 'shared/404', :status => 404 if @page.nil?
  end
end

show.html.erb:

<%= raw @page.content %>

route.rb:

match '/:id' => 'pages#show'

注意:因为该条目与所有条目都匹配,所以将其放在routes.rb的末尾。

然后由您决定如何创建,编辑和更新页面-您可以拥有管理界面,也可以以某种方式将其内置到公共界面中。这种方法也可以从页面缓存中受益。


8
您甚至不需要在控制器中包含空方法。编辑:另外,您可以将其作为一种“全部捕获”路由,放在所有其他内容之后:match':action'=>'pages'以避免在添加新页面时更新路由。但是,如果您有很多复杂的路线,则可能要小心一点。
Graham Edgecombe 2010年

非常感谢杰夫,那是当场!我想到的想法是2.方法,但我不知道该如何制作漂亮的url。再次谢谢你!
LuckyLuke

您可以为domain.com/p/blog-post-slug做一些匹配,然后将其匹配到/p/:id。P代表“职位”,实际上可以是任何东西。我认为这比任何路线都好。
诺亚·克拉克

什么:approximate_ascii啊 我找不到有关它的文档。但是,我假设它使用ASCII来近似UTF-8字符,这是默认值。github.com/FriendlyId/friendly_id/blob/master/lib/friendly_id/...
d_rail

1
@page = Page.find(params[:id])应改为@page = Page.find_by_id(params[:id])或者你只是得到默认的404(公共),而不是您的自定义404
d_rail


13

Jeff的方法#1(在视图中存储内容,并对每个静态页面进行路由和控制器操作)是一种很好的方法。我唯一要添加的就是在路由中使用controller

因此,代替此:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'

你可以这样做:

controller :pages do
  get :home
  get :about
  get :contact
end

这是两条额外的行,但更为优雅,因为它消除了重复,并在视觉上将静态页面路由分组在一起。

它还使用了get代替的http verb方法match这是Rails路线的一种更好的做法(并且更加简洁,现在Rails 4在使用时需要指定http谓词match


6

杰夫的方法#1对我来说很有用。这是使控制器动态查找页面的技巧。这样,您无需触摸控制器,也无需触摸route.rb即可添加页面。只需将页面拖放到app / views / pages下,控制器就会找到它。

class PagesController < ApplicationController
  def show
    render params[:id]
  end
end

这对我有效,但仅当我有比赛或上路时才适用。为了不必在route.rb中列出所有路由,还有其他需要做的事情吗?使用rails 3.2.12
jrich

始终警惕您对用户输入所做的操作。我尚未对此进行测试,但是render可以访问每个视图,因此我会担心params[:id]看起来像admin/whatever。FWIW,只要该视图存在于与您的控制器相对应的视图文件夹中,Rails就会自动渲染视图而无需创建控制器动作。您需要做的就是添加适当的路由,这没什么大不了的。
理查德·琼斯

6

查看Michael Hartl的http://railstutorial.org ,它具有2.3.8和3.0.x版本。它涵盖了许多出色的示例,并引导您尽早构建它们,并且您还将有机会学习比此示例更多的知识。我强烈推荐它。


现在,它具有3.2和4.0版本。
2013年

2

config / routes.rb

get ':id', to: 'pages#show'

app / controllers / pages_controller.rb

class PagesController < ApplicationController
  def show
    begin
      render params[:id]
    rescue ActionView::MissingTemplate
      render :file => "#{Rails.root}/public/404", :layout => false, :status => :not_found
    end
  end
end

然后将您的静态页面放置在app / views / pages / {name} .html.erb(或任何模板格式)中。



0

对于您的问题的适当答案基本上看起来像是对Rails框架的介绍:MVC结构,模板和至少路由DSL。Jeff做得很好,但您的回答仍然假设您掌握了许多Rails的基本知识。

但是我建议,如果您的Web应用程序真的那么简单,Rails可能会过大。我会研究更轻的东西,例如Sinatra,它的学习曲线比Rails低得多,并且在无需处理复杂的路由,魔术MVC动作/模板映射等情况下就可以很好地完成此类工作。


0

我建议将您的页面添加到公共文件夹中,以便直接提供服务而不必完全通过导轨。我不是专家,所以我不确定如果页面是静态的,这是否有任何弊端。


1
但是,这可以称为粗略解决方案。这将不允许我们利用Rails提供的功能,尤其是Common Layout DesignPage Caching。不过,我不会完全放弃此解决方案。
Sagar Ranglani 2014年

1
如果已将Apache或Nginx之类的东西配置为服务于public文件夹中的页面,则此技术很快就会实现,但是它会放弃页面上的任何形式的动态内容,例如显示用户登录/退出状态的导航栏。
理查德·琼斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.