0

私はここで概念的な問題で少し立ち往生しています。投稿、タグ、およびユーザーの次の [抽象化された] セットアップを想定します。

Post  belongs_to Tag
Tag   has_many   Posts
User  has_many   Tags,
      has_many   Posts

ユーザーは、関連付けられたタグの 1 つを使用してのみ投稿にタグを付けることができます。

新しい投稿フォーム ビューには、タグを選択するための次のオプションがあります。

  1. f.collection_select :tag_id, current_user.tags, ...

  2. f.collection_select :tag_id, @tags,そしてコントローラーの新しいアクションで:

    @tags = current_user.tags

質問: 概念的に正しいオプションはどれですか?

MVC の観点からは、私は間違いなく 2 番目のオプションを使用する傾向があります。collection_select でレンダリングする必要があるタグがユーザー (より具体的には、現在のユーザー) に関連付けられていることをビューが認識するのは正しくないようです。

ただし、collection_select の公式 API ドキュメントと、Web 上の他の チュートリアルには、次のようなものがあります。

collection_select(:post, :author_id, Author.all, ...)

これは明らかに最初のオプションを支持します。このアプローチのプロサイトでは、投稿の保存アクションが失敗し、新しいアクションを再度レンダリングしたい場合に備えて、コントローラーの作成アクションで @tags を再定義する必要はありません。

事前にご提案いただきありがとうございます。

4

1 に答える 1

1

最初のオプションに問題はありません。まず第一に、それはより単純です (コードの行が 1 行減ります)。コントローラー内に追加のインスタンス変数を設定しても、実際には何も得られません。

コントローラーについて考える良い方法は、コントローラーのみが受け取る入力 (URL 内のパラメーター、クエリ文字列、または POST フォームからのデータなど) に直接基づいている場合にのみ、変数を設定するなどのことを行うべきだということです。

この場合、ビューは現在のユーザーを決定する方法を決定していません-それはまだコントローラーから来ています(おそらくトップレベルのApplicationControllerまたはDeviseのようなものから継承されていますか?)、それがしているのは、それがのタグであることを決定することだけですドロップダウン ビュー内で選択できるようにする必要がある現在のユーザー。

それは役に立ちますか?

于 2011-06-28T21:56:59.630 に答える