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

show.html.erb

<%= @page_data.html_safe %>
于 2012-04-05T21:38:26.317 に答える
1

これをベストプラクティスと見なすか忌まわしいと見なすかはまだわかりませんが、同じ問題に取り組んだときに思いついたのは次のとおりです。

私の推論は、このサイトは特定の機能 (この議論ではあまり重要ではありません) + 組織自体に関する一連の情報 (私たちについて、連絡先、FAQ、ホームページの宣伝文句など) を提供していたということです。これらのデータはすべて実際に組織に関連していたので、組織モデルはそれらのそれぞれを属性として合理的に考えました。モデルは次のとおりです。

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 に実行させます。edit アクションは、1 つのビュー ファイルを使用してすべての異なる属性を編集します。

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

次に、各ページの対応する show controller アクションとビューで CMS からの情報を表示するコードを追加します。

于 2012-04-05T21:36:39.223 に答える