【发布时间】:2010-12-18 17:41:56
【问题描述】:
制作一个包含如下页面的 Ruby on Rails 应用程序的标准方法是什么
- 首页
- 关于
- 联系方式
如果有人有链接或答案,我会很高兴,而不仅仅是说使用 gem,因为我想学习如何使用这种行为制作简单的 webapps。
【问题讨论】:
标签: ruby-on-rails ruby
制作一个包含如下页面的 Ruby on Rails 应用程序的标准方法是什么
如果有人有链接或答案,我会很高兴,而不仅仅是说使用 gem,因为我想学习如何使用这种行为制作简单的 webapps。
【问题讨论】:
标签: ruby-on-rails ruby
取决于您希望如何处理这些页面中的内容。
方法 #1 - 在视图中存储内容
如果您只想将所有内容放在 ERB 视图中,那么一个非常简单的方法是创建一个PagesController,其目的是处理静态页面。每个页面由控制器中的一个操作表示。
pages_controller.rb:
class PagesController < ApplicationController
def home
end
def about
end
def contact
end
end
routes.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 布局。
您还需要查看 page caching 以提高自己的性能。
方法 #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
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 %>
routes.rb:
match '/:id' => 'pages#show'
注意:将此条目放在 routes.rb 的末尾,因为它匹配所有内容。
然后,您希望如何创建、编辑和更新页面取决于您 - 您可以拥有一个管理界面,或者以某种方式将其构建到您的公共界面中。这种方法也可以从页面缓存中受益。
【讨论】:
/p/:id。 P 代表“post”,可以是任何东西。我认为这比 match any 路线要好。
:approximate_ascii?我找不到关于它的文档。但是,我假设它使用 ASCII 来近似 UTF-8 字符,这是现在的默认值。 github.com/FriendlyId/friendly_id/blob/master/lib/friendly_id/…
@page = Page.find(params[:id]) 应更改为 @page = Page.find_by_id(params[:id]) 否则您将获得默认 404(公开)而不是自定义 404。
另一个选项是high_voltage gem:https://github.com/thoughtbot/high_voltage
这使得创建内容存储在视图中的静态页面变得非常容易。
【讨论】:
Jeff 的方法 #1(将内容存储在视图中并为每个静态页面设置路由和控制器操作)是一种很好的方法。我唯一要添加的是在您的路线中使用controller macro。
所以,不要这样:
match '/home' => 'pages#home'
match '/about' => 'pages#about'
match '/contact' => 'pages#contact'
你可以这样做:
controller :pages do
get :home
get :about
get :contact
end
这是两个额外的行,但更加优雅,因为它消除了重复并将您的静态页面路由可视化地组合在一起。
它还使用get http 动词方法代替match、which is a better practice for Rails routes(更简洁,现在Rails 4 requires the http verb to be specified when using match。
【讨论】:
Jeff 的方法 #1 对我来说非常有效。这是使控制器动态查找页面的技巧。有了这个,您不需要触摸控制器或 routes.rb 来添加页面。只需将页面拖放到 app/views/pages 下,控制器就会找到它。
class PagesController < ApplicationController
def show
render params[:id]
end
end
【讨论】:
render 可以访问每个视图,所以我会担心看起来像admin/whatever 的params[:id]。 FWIW,只要该视图存在于与您的控制器对应的视图文件夹中,Rails 就会自动呈现视图而无需创建控制器操作。您需要做的就是添加适当的路线,这没什么大不了的。
查看 Michael Hartl 的 http://railstutorial.org 它有 2.3.8 和 3.0.x 版本。它通过很好的示例涵盖了这一点,并引导您尽早构建它们,您还将有机会学到比这个示例更多的东西。 我强烈推荐它。
【讨论】:
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(或任何模板格式)中。
【讨论】:
您可以使用Jekyll bootstrap 或Jekyll using Danger blog 创建静态页面
参考非常有帮助。
【讨论】:
对您的问题的充分回答基本上看起来像是对 Rails 框架的介绍:至少是 MVC 结构、模板和路由 DSL。 Jeff 给了一个很好的答案,但他的回答仍然假设您有很多基本的 Rails 知识。
不过,我建议,如果您的 web 应用程序真的那么简单,Rails 可能会矫枉过正。我会研究一些更轻松的东西,比如Sinatra,它的学习曲线比 Rails 低得多,并且在这类事情上做得很好,而无需处理复杂的路由、魔术 MVC 动作/模板映射等。
【讨论】:
我建议将您的页面添加到公用文件夹中,以便直接提供服务,而无需通过 Rails。不过我不是专家,所以我不确定如果页面是静态的,这是否会有任何缺点。
【讨论】:
public 文件夹中的页面提供服务,那么这种技术会很快变得轻松,但它会放弃页面上的任何类型的动态内容,例如导航栏显示用户的登录/退出状态。