[英]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.