「current_user」がモデルに緊密に接続されている必要がありますが、コントローラですべて処理したところ、かなりうまく機能しています。ここにいくつかの例があります:
私のモデルは "写真"です。写真はユーザーによって所有されており、写真とのやりとりの仕方は明らかに写真の所有者とは密接に関係しています。人々が写真を作成すると
def show
@photo = Photo.find(params[:id])
if user_signed_in?
if @rating = current_user.ratings.find_by_photo_id(params[:id])
@rating
@current_user_rating = @rating.value
else
@rating = current_user.ratings.new
@current_user_rating = "n/a"
end
end
end
:私は既存のユーザーを評価すると、写真に与えられた(そう、彼らはそれを編集することができます)、またはそれらは新しいものを作成することができたか、ロードする必要がshowアクションで
私はそれらを自動的に現在のユーザーに割り当てるようにします。
def new
@photo = Photo.new
end
def create
@photo = current_user.photos.create(params[:photo])
if @photo.save
redirect_to user_path(current_user), :notice => t('photo.notice.created')
else
render 'new'
end
end
のみ写真の所有者は、それらを変更することができます。
def edit
@photo = Photo.find(params[:id])
if @photo.user == current_user
render 'edit'
else
redirect_to user_path(current_user), :alert => t('application.error.unauthorized')
end
end
def update
@photo = current_user.photos.find_by_id(params[:id])
@photo.update_attributes(params[:photo])
if @photo.save
redirect_to user_path(current_user), :notice => t('photo.notice.updated')
else
render 'edit'
end
end
このアプローチは、「CURRENT_USER」オブジェクトはコントローラのみが知っているセッションに結び付けられている制約に基づいています。要するに、私はまだ "current_user"をモデルに統合する良い方法を見つける必要はありませんが、モデルとコントローラを結びつけるきれいな方法を見つけることができました。コントローラによって。
コントローラが乱雑になり始めた場合、ロジックのチャンクを取り、モデルのメソッドとして定義することができますが、引数は1つ=ユーザーオブジェクトが必要です。次に、コントローラからそのメソッドに「current_user」を送り、モデルが残りの部分を処理します。
幸運を祈る!また、他の誰かがこれについてのより良いアイデアを持っているなら、私はそれらを聞いてみたい!
あなたの答えをありがとう、ありがとう。あなたのコードはうまくいくでしょうが、それをコントローラーに入れるのは間違いです(私の意見のみ)。私はすべてのビジネスロジックを単一のモジュール/クラスに入れて、それを必要とするモデルと混在させることを考えています。このように、私はすべてのロジックが1つの場所にあることを知っています(偉大)、私はモデルやコントローラーをあまり混乱させません。これについてあなたの考えは何ですか? – Zabba
すべてのロジックを1つの場所にグループ化する理由はありません。あなたが結果に満足している限り、コードは期待どおりに機能し、「どこのコードが再びどこにあるのか」という疑問を避けることができます。しかし、...(文字制限による次のコメントを参照してください) – Andrew
Railsを使用するほど、WebアプリケーションのMVCパターンに存在する「フロー」の種類が増えています。私にとっては、ほとんどのロジックはデータベース内のデータに関連すると考えられ、モデルに属しています。モデルからデータを取り出すためのセッションやHTTP要求を処理するロジックは、コントローラーで正しく認識され、少しのプレゼンテーションロジックが意味を成しています。トリックは、これらのエッジの場合、「current_user」のようなものはデータのように見えますが、実際にはそうではありません.HTTPリクエストに完全に関連しています。 (次のコメント) – Andrew