3

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

路线.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,因为“站点”不需要有 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

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

4

3 回答 3

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

显示.html.erb

<%= @page_data.html_safe %>
于 2012-04-05T21:38:26.317 回答
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

对于组织控制器,我只是在 before_filter 中将@organisation 变量设置为数据库中的第一行也是唯一的行,然后让 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 路由时,我会为这个设计决定付出代价,而且可能还有一千个其他原因表明这是一个我尚未发现的坏主意,但目前我有一个满意的客户。

最后,这不是建议你应该这样做,但我希望给你比我得到的更多,这样你就可以推进你的想法,并希望最终更接近最佳实践。

于 2012-04-06T15:03:24.810 回答
0

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

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

至于路线,我建议使用以下方法:

map.resource :controller_name

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

于 2012-04-05T21:36:39.223 回答