1


私は魔法のすべてが機能するレールアプリを持っています。
問題は、次のようなユーザーを編集するときです:
http://localhost:3000/users/1/edit
その作業はうまくいきますが、ユーザーIDを2または3に変更すると..
すべてのユーザーデータを更新できます
どうすれば制限できますか現在のユーザーがログインしたユーザーである場合にのみ、ページを編集します

ここに私のコントローラがあります:

skip_before_action :require_login, only: [:new, :create, :show]

def new
 @user = User.new
end

def create
@user = User.new(user_params)
if @user.save
  auto_login(@user)
  flash[:info] = "Welcome."
  redirect_to root_url
else
  render 'new'
end
end

def edit
  @user = User.find(params[:id])
end

def update
@user = User.find(params[:id])
if @user.update_attributes(user_params)
  flash[:success] = "Profile updated"
  redirect_to @user
else
  render 'edit'
end
end

def show
 @user = User.find(params[:id])
end

private

def user_params
 params.require(:user).permit(:email, :password, :password_confirmation)
end  
4

2 に答える 2

1

このようなこともできます

before_action :edit_rights?, only: [:update, :edit]

private
def edit_rights?
  @user = User.find(params[:id])
  redirect_to(root_path) unless current_user == @user
end

その場合、アクションとアクション@user = User.find(params[:id])の両方で必要はありませんupdateedit

于 2015-05-16T20:38:06.227 に答える
0

それには (少なくとも) 2 つの方法があります。最初の簡単な方法は別の回答で詳しく説明されています。コントローラーを微調整してください。

あまり明白でない方法は、単一のリソースと独自のコントローラーを作成することです。ルートでは次のようになります。

resource :profile, only: [:show, :edit, :update]
# generates:
# /profile (GET, PATCH, PUT)
# /profile/edit (GET)

次に、ユーザー自身のプロファイルのみを担当し、 でのみ動作するコントローラーを作成しますcurrent_user

はい、モデルがアプリのさまざまな部分でまったく異なる動作をする必要がある場合は、1 つのモデルが複数のコントローラーを持っていても問題ありません。

どうしてそうするか?

  • ユーザー自身のプロファイルには、公開されているよりもはるかに多くの情報が表示される可能性があります。別のビューでレイアウトできます
  • リソースは を介し​​て自動選択されるため、「アクセス拒否」エラーは発生しません。current_user必要なのは、ユーザーがコントローラー全体にログインしていることを確認することだけです。
于 2015-05-17T09:54:45.950 に答える