2

Rails初心者はこちら

管理者ユーザーが自分自身を削除できないようにするコールバックを実装したユーザー リソースがあります。

before_filter :admin_no_delete,    only: :destroy

def admin_no_delete 
  admin_id = current_user.id if current_user.admin?
  redirect_to root_path if params[:id] == admin_id 
end      

これがよく知られているように見える場合は、Michael Hartl の rails チュートリアルの演習 #10 からのものですが、彼が提案したのとは異なり、別の方法で実行しようとしました。

これに対する私の(不十分な)テストは失敗します

    describe "deleting herself should not be permitted" do
      before do
        delete user_path(admin) 
      end
      it { should_not redirect_to(users_path) }
    end

しかし、管理者ユーザーがテストするためだけに削除リンクを公開してそのリンクをクリックすると、コールバックが実際に実行に成功したように見えます (root_path へのリダイレクト)。

jQuery を使用して destroy アクションを呼び出し、コールバックによって保護されているレコードを削除することができました (Web Inspector の JavaScript コンソールを使用)。

$.ajax({url: 'http://localhost:3000/users/104', type: 'DELETE', success: function(result){alert(result)} })

この状況で DELETE HTTP リクエストが成功しないようにする方法についてのアイデアを探しています..また、この種の状況を適切にテストする方法についてのアイデアはありますか?

ありがとう。

4

2 に答える 2

0

admin_id、整数を と比較していparams[:id]ます。の値paramsは常に文字列 (またはより多くの文字列を含む配列/ハッシュ) であるため、比較は常に失敗します。

于 2012-04-04T13:00:43.200 に答える
0

シンプル:params[:id]は文字列、admin_idは Fixnum です。次のように変更するだけで、動作するはずです。

redirect_to root_path if params[:id].to_i == admin_id

ただし、使用しているロジックは少し奇妙に思えます。1 つのアクションのためだけに before フィルターを使用する理由と、リダイレクトを変更する理由は何ですか? ロジックは破棄アクションに直接含まれている必要があり、次のようになると思います。

def destroy
  unless current_user.admin? && current_user.id == params[:id].to_i
    User.find(params[:id]).destroy
    flash[:success] = "User destroyed."
  end
  redirect_to users_path
end
于 2012-04-04T13:01:02.040 に答える