2012-04-04 3 views
2

Rails beginners here ..この状況でDELETE HTTP要求が成功するのを防ぐにはどうすればよいですか?

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

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  

これは、いくつかの見慣れた場合、それはマイケル・ハートルのレールチュートリアル、exercise #10 hereからだが、私は彼が示唆されていないとして、別々にそれを実行しようとしました。

は、私は(ラメ)は、このためのテストは

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にリダイレクト

を失敗し )。

私は(ウェブインスペクターのJavaScriptコンソールを使用して)コールバックにより保護されているレコードを削除するにjQueryを使用して破壊するアクションを呼び出すことができました:

からDELETE HTTP要求を防ぐ方法についてのアイデアを探してい
$.ajax({url: 'http://localhost:3000/users/104', type: 'DELETE', success: function(result){alert(result)} }) 

このような状況で成功するためにどのように適切にテストするためのアイデアも?

ありがとうございました。

+0

テストテストは何ですか?削除が成功した後にリダイレクトしませんか? –

+0

'id' 104を持つ' User'は実際にデータベースから削除されていますか? –

+0

@FrederickCheung - ありがとう、私は自分の間違いを認識した... users_pathへのリダイレクトを削除する必要があったので、should_not ..その場合、テストは実際に失敗する – rme

答えて

0

シンプル:params[:id]は文字列、admin_idはフィックスナムです。次のようにあなたはそれを変更することができ、それが動作するはずです:

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

使用しているロジックは、しかし、私には少し奇妙に思えます。なぜなら、1つのアクションのためのもので、リダイレクトを変更する理由は、前のフィルタを使用する理由ですか?私はロジックが破壊アクションに直接参加し、このようなものになるはずだと思う:

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 
+0

ありがとう。このチュートリアルでは、実際には破壊アクションそのものに入れることを提案していました。私はそれを理解するには余りにも時間がかかりました - 明らかにこの間違いはそれを示しています。私が書いたテストは良いものだとは思わない。それを改善するためのヒントをいただければ幸いです。 – rme

+1

破壊操作では、DBの変更(またはその不在)を確認することをお勧めします。私はときどき次のようなことをします: 'lambda {user_path(admin)}を削除する。{User.count} .by(0)' – tsherif

+0

私は数を調べることを考えましたが、そのコンテキストで実装する方法はわかりませんでした。あなたの助けをありがとう! – rme

0

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

+0

ありがとう、うんん、そこに間違いです... – rme

関連する問題