2012-04-20 12 views
1

私はDeviseとCancanをWebアプリケーションに組み込みたいと思っています。ユーザーを削除するにはrole => "admin"というユーザーが必要ですが、Deviseのdestroyアクションはユーザーが自分自身を削除できるようにするため、この目的のためのカスタムアクションを作成しました。 (プラグインのコントローラファイルを上書きするには、私はアプリ/コントローラ/ registrations_controller.rbに上の登録コントローラをコピーした。)ルビーのルートとカスタムアクション

ここに私registrations_controller.rbの私のカスタムアクションです:

def destroy_user_account 
    @user = User.find_by_id(params[:user])   
    @user.destroy 
    redirect_to profiles_path, :flash => { :success => "User deleted!" } 
    authorize! :destroy, User, :message => "You don't have authorisation to delete this user."   
end 

ここれますあなたがユーザーのプロフィールを閲覧しているページのリンクに、私がそれをどのように使用しようとしているかを示します。 (私は、各ユーザーにhas_oneプロファイルとなるように設定ものを持っている、プロファイルを使用すると、フロントエンドで見るものですプロファイルは自動的にユーザー登録にプロファイルテーブルに作成されています。。)

<% if can? :update, @profile %> 
     | <%= link_to 'Edit Profile', edit_profile_path(@profile) %> 
     | <%= link_to 'Edit Settings', edit_settings_path %> 
    <% end %>    
    <% if can? :destroy, @profile.user %> 
     | <%= link_to "Delete User", destroy_user_account(@profile.user), 
         :class => "delete", 
         :confirm => "Are you sure?", 
         :title => "Delete #{@profile.user.name}" 
    %> 
    <% end %> 

私のテストは2つの失敗を示しています私は解決できない。

1) ProfilesController GET show when signed in as an admin should have a link to edit the profile Failure/Error: get :show, :id => @profile ActionView::Template::Error: undefined method destroy_user_account' for #<#<Class:0x105b474a8>:0x1057f32e8> # ./app/views/profiles/show.html.erb:41:in _app_views_profiles_show_html_erb___917863454_2195331000_0' # ./spec/controllers/profiles_controller_spec.rb:143

2) ProfilesController GET show when signed in as an admin should have a link to delete the user's account (using the destroy_user_account action in the registrations controller) Failure/Error: get :show, :id => @profile ActionView::Template::Error: undefined method destroy_user_account' for #<#<Class:0x105b474a8>:0x105806d20> # ./app/views/profiles/show.html.erb:41:in _app_views_profiles_show_html_erb___917863454_2195331000_0' # ./spec/controllers/profiles_controller_spec.rb:148

をまた、私は私のブラウザでそれを試してみたときに、「ユーザーの削除」リンクをクリックすると、私は次のエラーを取得します。ここでは

Routing Error

No route matches "/destroy-user-account/2"

はルートですそのこれをカバーする必要があります:

devise_for :users, #:path => '', :skip => [ :confirmations, :passwords, :registrations ], :controllers => { :registrations => "registrations" } do

# Routes for ACCOUNT REGISTRATIONS 
get  "join",       :to => "registrations#new", :as => :new_user_registration 
post "join",       :to => "registrations#create", :as => :user_registration 
get  "settings/account",    :to => "registrations#show", :as => :settings 
get  "settings/account/edit",   :to => "registrations#edit", :as => :edit_settings 
put  "settings/account",    :to => "registrations#update", :as => :update_settings 
delete "close-my-account/:id",   :to => "registrations#destroy", :as => :close_my_account 
delete "destroy-user-account/:id",  :to => "registrations#destroy_user_account", :as => :destroy_user_account 

誰かが私が間違っていることを助けることができますか?

答えて

0

ブラウザではGETリクエストを送信しているため、ルートは一致しませんが、ルートはDELETEリクエストと一致しています。ルートがdestroy_user_accountの代わりにdestroy_user_account_pathという名前を付けるため、テストは失敗します。

試してみてください。

<%= link_to "Delete User", destroy_user_account_path(@profile.user), 
         :class => "delete", 
         :confirm => "Are you sure?", 
         :title => "Delete #{@profile.user.name}" 
         :method => :delete 
%> 
+0

あなたはもちろんdestroy_user_account_pathのもので、絶対的に正しいです。ありがとう! – Reb

+0

もう一つは、私の行動に問題があったので、すべて解決しました。ありがとうヒープ! – Reb

関連する問題