我开发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
还是有一个最好的做法/更好的办法? 任何答案,将不胜感激。 谢谢
如果静态页面列表不会增加,那么你就可以保持列表中,但如果你想有一个动态列表,像网站/ 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 %>
不知道但如果我认为这是一个最佳实践或憎恶,但这里是我想出了解决同样的问题时。
我的理由是,该网站提供了一些特定的功能(这并不重要,这个讨论)+一堆关于组织本身的信息(关于我们,联系,FAQ,网页Blurb的,等等)。 由于所有的数据是真的与组织,组织模式似乎与每个那些东西的属性合理。 这里是模型:
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
所以这就是我结束了。 就像你我打了这么进军天才这里的沸腾质量,但结束了令人失望的结果 。 如果有更好的东西在那里,我还是希望能找到它。
我喜欢我所做的是,路线是基于组织表的结构自动生成的。
我不喜欢我所做的是,路由基于组织表的结构自动生成的。
我知道我会为设计决策付出时,我不得不面对国际化的路由和可能有其他一千个理由,这是一个坏主意,我还没有发现,但目前我有一个幸福的客户端。
到底这是不是你应该做这样的建议,但我希望给你超过我,所以你可以提前在此你的想法,并希望最终更接近最佳实践一点点。
如果你要建立一个CMS,这可能连接到一个数据库,并允许客户改变他们的网站的网页上的文字,我不建议使用静态页面。 在Rails方面,静态页面会提到你的/视图/页目录中创建HTML文件。 如果你走这条路线,然后你走的Rails所设计的方式之外。
我相信,你想要做的是在数据库中创建对应表和数据存储自己的帖子等,您可以拉进信息从它对应,然后用户视图来显示数据模型控制器。 您可以创建这些页面的布局,然后为每个所添加的页面控制器。
至于路线,我会建议使用下列内容:
map.resource :controller_name
那么你想补充一点,显示从CMS在相应的显示控制器的动作,并查看每个页面的信息的代码。