before_filterを実行して、ユーザーがcurrent_userであるかどうかを確認します。before_filterをバイパスしますが、別のコントローラー/ビューからアクセスした場合のみ
before_filter :correct_user, :only => [:edit, :update, :destroy]
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
redirect_to current_user, :notice => "User updated!"
else
redirect_to current_user, :notice => "User not updated. waa waa."
end
end
private
def correct_user
if current_user != @user
redirect_to root_url, :notice => "Cannot act on different user."
end
end
ない、
今すぐユーザーhas_manyの写真(多分単に代わりのparamsを経由して@userを見つけるのCURRENT_USERを使用するより良い練習ですか?)これは、物事を行うための最善の方法ですが、それが動作するかどうか確認してください私の写真のインデックスビューでは、私はすべてのユーザーの写真を一覧表示し、ユーザーがいずれかの写真をプロフィール写真として設定できるようにします。ユーザテーブルには、このIDを保持するために、primary_photo_idという列があり、私はこれを設定するのlink_toを使用します。
=link_to "Make this your profile photo", user_path(@user, :user => {:primary_photo_id => "#{photo.id}"}), :method => :put
問題は@userがあるというためとでbefore_filterキックが働いてからこれを防ぐということですparams [:id]を介して取得されたものは、正しいparamsではないため失敗します。 before_filterを削除してもうまくいきますが、正しいユーザーをチェックしていません。
(第2やや関連する質問は、上記のコードが動作する理由ですが、この1:
=link_to "Make this your profile photo", user_path(@user, :primary_photo_id => "#{photo.id}"), :method => :put
はしていません
感謝することができます何ので、私はかなりレールに新しいとプログラミングです。
これはうまくいった。マットありがとう!実際には2つのbefore_filtersを使用することにしました。最初はget_userに、もう1つは正しいユーザーをチェックするためです。おそらくあまり「乾いていない」とは思えますが、私には少しはっきりしています。 user = user.find(params [:id])を使用する代わりに、私はuser = current_userを実行することもできます(セッションのユーザーを取得するヘルパーメソッドがあるので)。他の誰かがログインできるユーザー以外は実行できないはずのものはありますか? – kindofgreat
ええ、この種の状態では、ユーザーが管理者であるかどうかを判断し、そうでなければログインしたユーザーにハードワイヤーを設定することができるように、フィルターを設定します。 '@user = current_user.adminのようなもの? ? User.find(params [:id]):current_user'です。 管理者のケースがない場合は、ユーザーオブジェクトがインスタンス化されている可能性があり、別の参照を行うことがないため、current_userに直接設定します。 –