QA@IT

ヘッダであるtitleとdescriptionを、各ページ毎に変更する際のコントローラの設計

2328 PV

現在、Rails3.2を使ってシステムを作っています。
現在、各ページ毎に異なるtitleとdescriptionをつけようとしているのですが、コントローラのソースが醜くなって困っています。

具体的に、QA@ITを例に使って、やりたい事を説明させていただきます。

このサイトは、indexを表示する方法は3種類あると思います。

タグを検索するときは、
q/tagged/rails

ワードを検索するときは、
q/search

一覧は
q/
と別々のURLになっています。

そこで自分は、このURL設計を模倣して実装するしてみました。

結果、Qコントローラのindexは

class Q < ApplicationController

def index
  _index
end

def index_search 
  _index
end

def index_tagged
   _index
end

def _index
end

end

こんな感じの実装になりました。index_tagged等へはroutes.rbで結びつけます。

そして次に、質問の内容通り、各indexで別々のtitleとdescriptionをつけるため、下記のように実装しました。(ちなみにGemはmeta-tagsを使ってます。)

class Q < ApplicationController

def index
   set_meta_tags :title => "QA_IT"

  _index
end

def index_search 
   set_meta_tags :title => "~の検索結果。"
  _index
end

def index_tagged
   set_meta_tags :title => "~のタグに関係する記事"
   _index
end

def _index
end

end

ここで少し美しくないと考えました。
なぜなら似た様な処理が、すべてのindexにバラバラに実装されています。さらにもうちょっとこだわったtitle等をつけようとすると、結構な量のコードをindexメソッド内部で書く羽目になります。あと実はshow等もつけなければなりません。

自分でも一応対策を考えましたが、どれも欠点があります。

  • すべてのコントローラにfilterをかける。

fileterをかければ、すべての処理を別のメソッドにまとめられますが、そのためにはfileterをコントローラのメソッド分、定義し実装する必要性があります。(例:metafileter_index,metafileter_index_search、……)

  • 共通のメソッドである_indexでいい感じに処理する。

これもありなのですが、このメソッドの内部で「もしindexなら、もしindex_tagなら…」ともう一度分解する必要性があり、DRYではありません。

長くなりましたが、この場合どうするのがベストでしょうか?曖昧な質問ですが、ご回答いただけると幸いです。

回答

content_for を使うのでどうでしょうか。

編集 履歴 (0)
  • お返事ありがとうございます。
    content_forを使うというのはつまり、コントローラのメソッド毎にviewを書いて、title、description等の設定を各viewでするべきということでしょうか?
    -
  • はい -
ウォッチ

この質問への回答やコメントをメールでお知らせします。