私は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:1432) 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
誰かが私が間違っていることを助けることができますか?
あなたはもちろんdestroy_user_account_pathのもので、絶対的に正しいです。ありがとう! – Reb
もう一つは、私の行動に問題があったので、すべて解決しました。ありがとうヒープ! – Reb