在Rails应用静态页面的最佳实践(Best practices for static pages

2019-09-16 09:23发布

我开发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

还是有一个最好的做法/更好的办法? 任何答案,将不胜感激。 谢谢

Answer 1:

如果静态页面列表不会增加,那么你就可以保持列表中,但如果你想有一个动态列表,像网站/ 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 %>


Answer 2:

不知道但如果我认为这是一个最佳实践或憎恶,但这里是我想出了解决同样的问题时。

我的理由是,该网站提供了一些特定的功能(这并不重要,这个讨论)+一堆关于组织本身的信息(关于我们,联系,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

所以这就是我结束了。 就像你我打了这么进军天才这里的沸腾质量,但结束了令人失望的结果 。 如果有更好的东西在那里,我还是希望能找到它。

我喜欢我所做的是,路线是基于组织表的结构自动生成的。

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

我知道我会为设计决策付出时,我不得不面对国际化的路由和可能有其他一千个理由,这是一个坏主意,我还没有发现,但目前我有一个幸福的客户端。

到底这是不是你应该做这样的建议,但我希望给你超过我,所以你可以提前在此你的想法,并希望最终更接近最佳实践一点点。



Answer 3:

如果你要建立一个CMS,这可能连接到一个数据库,并允许客户改变他们的网站的网页上的文字,我不建议使用静态页面。 在Rails方面,静态页面会提到你的/视图/页目录中创建HTML文件。 如果你走这条路线,然后你走的Rails所设计的方式之外。

我相信,你想要做的是在数据库中创建对应表和数据存储自己的帖子等,您可以拉进信息从它对应,然后用户视图来显示数据模型控制器。 您可以创建这些页面的布局,然后为每个所添加的页面控制器。

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

map.resource :controller_name

那么你想补充一点,显示从CMS在相应的显示控制器的动作,并查看每个页面的信息的代码。



文章来源: Best practices for static pages in rails app