簡體   English   中英

Rails 應用中 static 頁面的最佳實踐

[英]Best practices for static pages in rails app

我正在 ruby on rails 為本地企業開發一個應用程序。 這些頁面是“靜態的”,但可以通過我為它們構建的后端 CMS 進行更改。 是否有為 static 頁面創建 controller 的最佳實踐? 現在我有一個站點 controller,其中包含所有 static 條路線,就像這樣。

路線.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"

或者我會更好地為站點 controller 創建沒有 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

還是有最佳實踐/更好的方法? 任何答案將不勝感激。 謝謝

如果 static 頁面列表不會增加,那么您可以保留該列表,但如果您想要一個像 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 %>

不知道我是否認為這是最佳實踐或可憎行為,但這是我在解決相同問題時想到的。

我的理由是該網站提供了一些特定的功能(這對本次討論來說並不重要)+ 一堆關於組織本身的信息(關於我們、聯系方式、常見問題解答、主頁簡介等)。 由於所有這些數據都與組織相關,因此組織 model 將這些數據作為屬性似乎是合理的。 這是 model:

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 class 方法根據列生成路由。 這是在我的 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

controller 有點奇怪,我對這里的代碼並不感興趣,但無論如何它就在這里。 我需要確保該屬性已設置並可用於視圖,以便我可以在那里做正確的事情,所以我在應用程序 controller 中設置了它:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_attribute

  def set_attribute
    @attribute = action_name.parameterize
  end

end

對於組織 controller,我只是在 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 路由時,我會為這個設計決定付出代價,而且可能還有一千個其他原因表明這是一個我尚未發現的壞主意,但目前我有一個滿意的客戶。

最后,這並不是建議你應該這樣做,但我希望能給你比我得到的更多的東西,這樣你就可以推進你對此的思考,並希望最終能更接近最佳實踐。

如果您要構建一個可能連接到數據庫的 CMS,並允許您的客戶更改其站點頁面上的文本,我不建議使用 static 頁面。 在 Rails 術語中,一個 static 頁面指的是在 /views/pages 目錄中創建 html 個文件。 如果你 go 這條路線,那么你就走在 Rails 的設計方式之外。

我相信你想要做的是在數據庫中創建對應於你的帖子數據的表,等等。你可以將信息從它對應的 model 中提取到 controller 中,然后使用一個視圖來顯示數據. 您可以為這些頁面創建布局,然后為您添加的每個頁面創建控制器。

至於路線,我建議使用以下路線:

map.resource :controller_name

然后,您將在每個頁面的相應顯示 controller 操作和視圖中添加顯示來自 CMS 的信息的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM