Ruby on Rails中的静态页面

Luc*_*uke 75 ruby ruby-on-rails

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

  • 关于
  • 联系

如果有人有链接或答案而不是仅仅说使用宝石,我会想知道因为我想学习如何使用这种行为制作简单的webapps.

Jef*_*eff 112

取决于您希望如何处理这些页面中的内容.

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

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

pages_controller.rb:

class PagesController < ApplicationController
  def home
  end

  def about
  end

  def contact
  end
end
Run Code Online (Sandbox Code Playgroud)

routes.rb中:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'
Run Code Online (Sandbox Code Playgroud)

然后在app/views/pages下创建home.html.erb,about.html.erb和contact.html.erb视图.这些视图包含您在静态页面上所需的任何内容.默认情况下,它们会使用您应用的application.html.erb布局.

您还需要查看页面缓存以提高性能.


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

我使用的另一种方法是为静态页面创建一个非常基本的CMS.在这种情况下,页面在模型中表示.它使用friendly_id gem来处理每个页面的slug,以便可以通过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
Run Code Online (Sandbox Code Playgroud)

pages_controller.rb:

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

show.html.erb:

<%= raw @page.content %>
Run Code Online (Sandbox Code Playgroud)

routes.rb中:

match '/:id' => 'pages#show'
Run Code Online (Sandbox Code Playgroud)

注意:将此条目放在routes.rb的末尾,因为它匹配所有内容.

那么你想要如何创建,编辑和更新页面取决于你 - 你可以拥有一个管理界面,或者以某种方式将它构建到你的公共界面.这种方法也可以从页面缓存中受益.

  • 您甚至不需要在控制器中包含空方法.编辑:此外,你可以把它作为一种"赶上所有"的路线在其他一切之后:匹配':action'=>'pages'以避免在添加新页面时需要更新路线.但是,如果您有许多复杂的路线,您可能需要小心. (8认同)

Max*_*ick 24

另一种选择是high_voltagegem:https://github.com/thoughtbot/high_voltage

这使得创建静态页面变得非常容易,其中内容存储在视图中.


Ric*_*nes 14

Jeff的方法#1(在视图中存储内容并为每个静态页面设置路由和控制器操作)是一个很好的方法.我唯一要补充的是在你的路线中使用controller.

所以,而不是这个:

match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

controller :pages do
  get :home
  get :about
  get :contact
end
Run Code Online (Sandbox Code Playgroud)

这是两条额外的线条,但更加优雅,因为它消除了重复,并将您的静态页面路径组合在一起.

它还使用gethttp动词方法代替match,这是Rails路由的一种更好的做法(更简洁,现在Rails 4要求在使用时指定http动词match.


tra*_*day 6

查看Michael Hartl的http://railstutorial.org ,其中包含2.3.8和3.0.x版本.它通过很好的例子来介绍它,并引导您在很早的时候构建它们,并且您还将有机会比这个例子学到更多东西.我强烈推荐它.


tim*_*eon 6

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

class PagesController < ApplicationController
  def show
    render params[:id]
  end
end
Run Code Online (Sandbox Code Playgroud)