QA@IT
«質問へ戻る

タイトル修正

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

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

現在、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ではありません。

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

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

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

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

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

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

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

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

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

```rb
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](https://github.com/kpumuk/meta-tags)を使ってます。)

```rb
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ではありません。


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

質問を投稿

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

現在、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ではありません。

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

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

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

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

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

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

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

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

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

```rb
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](https://github.com/kpumuk/meta-tags)を使ってます。)

```rb
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ではありません。


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