rails app中静态页面的最佳实践

我正在开发一个用于本地业务的ruby on rails应用程序。 页面是“静态的”,但可以通过我为他们构建的后端CMS进行更改。 是否有为静态页面创建控制器的最佳实践? 现在我有一个包含所有静态路由的站点控制器,就像这样。

的routes.rb

get "site/home" get "site/about_us" get "site/faq" get "site/discounts" get "site/services" get "site/contact_us" get "site/admin" get "site/posts" 

或者我会更好地为这样的站点控制器创建成员路由,而不是因为“站点”不需要CRUD。

 resources :sites, :except => [:index, :new, :create, :update, :destroy] member do get :home get :about_us get :faq get :discounts get :services get :contact_us get :admin get :posts end 

或者有最佳实践/更好的方法吗? 任何答案将不胜感激。 谢谢

如果静态页面列表不会增加,那么您可以保留列表,但如果您想要像site / any_new_url这样的动态列表,请将路由保存为

 get 'site/:cms_page' => 'cms#show' # all requests matching site/any_page will go CmsController, show method 

这有助于减少路线膨胀,但缺点是你不知道所有路线都是有效路线。 您的示例代码可以是

 def show @page_data = Page.find_by_page(:params[:cms_page]) end 

show.html.erb

 <%= @page_data.html_safe %> 

Dunno,如果我认为这是一种最佳实践或令人厌恶,但这是我在解决同样的问题时想出的。

我的理由是该网站提供了一些指定的function(这对于这个讨论并不重要)+一堆关于组织本身的信息(关于我们,联系方式,常见问题,主页模糊,等等)。 由于所有数据都与组织真正相关,因此组织模型似乎是合理的,每个事物都是属性。 这是模型:

 class Organisation < ActiveRecord::Base ...validations stuff... def self.attrs_regex Regexp.new(self.attrs.join("|")) end def self.attrs self.column_names.reject{|name| name =~ /id|created_at|updated_at/} end end 

然后我使用attrs类方法根据列生成路由。 这是在我的routes.rb中:

 Organisation.attrs.each do |attr| get "#{attr}" => "organisation##{attr}", :as => attr.to_sym get "#{attr}/edit" => "organisation#edit", :as => "#{attr}_edit".to_sym, :defaults => { :attribute => attr } post "#{attr}" => "organisation#update", :as => :organisation_update, :defaults => { :attribute => attr}, :constraints => Organisation.attrs_regex end 

控制器有点奇怪,我对这里的代码并不感到兴奋,但无论如何它都在这里。 我需要确保属性已设置并可供视图使用,因此我可以在那里做正确的事情,所以我在应用程序控制器中设置它:

 class ApplicationController < ActionController::Base protect_from_forgery before_filter :set_attribute def set_attribute @attribute = action_name.parameterize end end 

对于组织控制器,我只是将@organisation变量设置为before_filter中数据库中的第一个也是唯一一个行,然后让Rails执行调用方法,失败并呈现相同名称的视图。 编辑操作只使用一个视图文件来编辑所有不同的属性:

 class OrganisationController < ApplicationController before_filter :set_organisation def edit authorize! :edit, @organisation @attribute = params[:attribute].parameterize end def update authorize! :update, @organisation @attribute = params[:attribute] respond_to do |format| if @organisation.update_attributes(params[:organisation]) format.html do redirect_to "/#{@attribute}", notice: t('successful_update') end format.json { head :ok } else format.html { render action: "edit" } end end end private def set_organisation @organisation = Organisation.first end end 

这就是我结束的地方。 就像你一样,我在这里点击了SO,以挖掘这里沸腾的天才,但结果令人失望 。 如果有更好的东西,我仍然希望找到它。

我喜欢做的是根据组织表的结构自动生成路由。

我不喜欢我所做的是根据组织表的结构自动生成的路由。

我知道当我必须处理i18n路由时,我会支付这个设计决定,并且可能还有其他一千个原因,这是一个坏主意,我还没有发现,但目前我有一个快乐的客户。

最后这并不是你应该这样做的建议,但是我希望能给你比我更多的东西,这样你就可以提高你的思维,希望最终能够接近最佳实践。

如果您要构建可能连接到数据库的CMS,并允许您的客户更改其网站页面上的文本,我建议不要使用静态页面。 在Rails术语中,静态页面指的是在/ views / pages目录中创建html文件。 如果你走这条路,那你走的就是Rails设计的方式。

我相信你想要做的是在数据库中创建对应并存储post数据等的表格。你可以从与其对应的模型中将信息提取到控制器中,然后使用视图来显示数据。 您可以为这些页面创建布局,然后为您添加的每个页面创建控制器。

至于路线,我建议使用以下内容:

 map.resource :controller_name 

然后,您将在相应的show controller操作和每个页面的视图中添加显示CMS信息的代码。