0

ProTipスキャフォールドジェネレーターを使用して作成されたモデルがあります。を除くすべてのアクションは、管理者indexshowある必要があります。

ユーザーが自分ProTipのを送信できるようにしたいのですが、誰かが承認するまでキューに保存します。

これを行うには、いくつかの方法が考えられます。

  1. UserSubmittedProTipと同じフィールドを使用して、とはまったく異なるモデルを作成しますProTip。、およびアクションを使用して新しいUserSubmittedProTipControllerを作成します。アクションでは、データベースに保存する前に、新しいものを作成し、そこからプロパティをコピーすることができます。アクションに管理者を要求し、それを使用して承認を実行することができます。indexnewcreatecreateProTipUserSubmittedProTipindex

  2. とアクションSubmitControllerのみで新しいを作成します。どういうわけかの部分を共有するが、どのコントローラーに送信するかを知っているビューを作成します。アクションで、保存する前にに設定できました。次に、承認するためのメカニズムを作成する必要があります。newcreateProTip_formcreateProTip.approvedfalse

最初の方法は、2番目の方法を実装する方法がわからないため、最も簡単なようです。どちらの方法も少し不器用で、このタイプの問題のベストプラクティスは何でしょうか。

これらはこの問題を解決する唯一の2つの方法ですか?そうでない場合、何が賢くなりますか?それ以外の場合、どちらがベストプラクティスに近いのでしょうか、それとも両方とも明らかに間違っているのでしょうか。

4

1 に答える 1

1

私は最初の解決策をお勧めしません。

あなたのシナリオでは、本当に必要がなければ、これに実際に2つのコントローラーを使用する理由はありません。

現在のユーザーが管理者の場合は、通常どおりオブジェクトを作成できます。

現在のユーザーが管理者でない場合は、オブジェクトを作成しますが、アイテムの承認が必要なブール値を設定するか、その逆を行います。管理者の場合は、「承認済み」フラグを設定します。

管理者がリストアクションを確認すると、追加の「承認」列を表示できます。

def create
  @protip = Protip.new(params[:protip]
  # I'm assuming you have logic to determine if the user is an admin.
  # I usually encapsulate that in a method on the user model. So
  # my code would look like this:
  @protip.approved = true if current_user.is_an_admin
  if @protip.save
     ... do your normal stuff


end

承認されたprotipsの範囲があることを確認してください

scope :approved, where(:approved => true)

そして、常にそれらを表示します。

@protips = Protip.approved

それらを別々に保ちたい場合は、確かにパーシャルを再利用できます。レンダリングを呼び出すときに、パーシャルを取得する場所を指定できます。

render "/protips/_form"

はじめはどうですか?

于 2012-08-24T17:01:59.487 に答える