我正在为当地企业开发一个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
或者有最好的做法/更好的方法吗?任何答案将不胜感激。感谢
答案 0 :(得分:5)
如果静态页面列表不会增加,那么您可以保留列表,但如果您想要一个像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 %>
答案 1 :(得分:1)
我的理由是网站提供了一些指定的功能(这对于这个讨论并不重要)+一堆关于组织本身的信息(关于我们,联系方式,常见问题,主页模糊,等等)。由于所有数据都与组织密切相关,因此组织模型似乎是合理的,每个事物都是属性。这是模型:
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以挖掘这里沸腾的天才,但结果却是disappointing results。如果有更好的东西,我仍然希望找到它。
我喜欢做的是根据组织表的结构自动生成路由。
我不喜欢我做的是根据组织表的结构自动生成的路由。
我知道当我必须处理i18n路由时,我会支付这个设计决定,并且可能还有其他一千个原因,这是一个不好的想法,我还没有发现,但目前我有一个快乐的客户。
最后这不是你应该这样做的建议,但是我希望能给你更多的东西,所以你可以提高你的思维,希望最终能够接近最佳实践。
答案 2 :(得分:0)
如果您要构建可能连接到数据库的CMS,并允许您的客户更改其网站页面上的文本,我建议您不要使用静态页面。在Rails术语中,静态页面指的是在/ views / pages目录中创建html文件。如果你走这条路,那么你就走出了Rails设计的方式。
我相信您要做的是在数据库中创建与您的帖子等对应并存储数据的表格。您可以从与其对应的模型中将信息提取到控制器中,然后使用视图显示数据。您可以为这些页面创建布局,然后为您添加的每个页面创建控制器。
就路线而言,我建议使用以下内容:
map.resource :controller_name
然后,您将在相应的show controller操作和视图中添加显示CMS信息的代码。