制作具有如下页面的Ruby on Rails应用程序的标准方法是什么?
- 家
- 关于
- 联系
我会问别人是否有链接或答案,而不是仅仅说使用gem,因为我想学习如何制作具有这种行为的简单webapp。
Answers:
取决于您要如何处理这些页面中的内容。
方法#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的末尾。
然后由您决定如何创建,编辑和更新页面-您可以拥有管理界面,也可以以某种方式将其内置到公共界面中。这种方法也可以从页面缓存中受益。
/p/:id
。P代表“职位”,实际上可以是任何东西。我认为这比任何路线都好。
: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
宏。
因此,代替此:
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
。
杰夫的方法#1对我来说很有用。这是使控制器动态查找页面的技巧。这样,您无需触摸控制器,也无需触摸route.rb即可添加页面。只需将页面拖放到app / views / pages下,控制器就会找到它。
class PagesController < ApplicationController
def show
render params[:id]
end
end
render
可以访问每个视图,因此我会担心params[:id]
看起来像admin/whatever
。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引导程序创建静态页面,也可以使用Danger博客创建Jekyll。
引用它非常有帮助。
我建议将您的页面添加到公共文件夹中,以便直接提供服务而不必完全通过导轨。我不是专家,所以我不确定如果页面是静态的,这是否有任何弊端。
public
文件夹中的页面,则此技术很快就会实现,但是它会放弃页面上的任何形式的动态内容,例如显示用户登录/退出状态的导航栏。