2013-04-29 14 views
11

Đối với đơn đăng ký của tôi, tôi có tài khoản người dùng mà mọi người có thể đăng ký. Tôi sử dụng đá quý devise để thiết lập.Rails - Làm thế nào để tiêu diệt người dùng tạo theo Devise?

Tôi cũng có trang người dùng liệt kê tất cả người dùng đã đăng ký trang web cùng với liên kết destroy. Tôi muốn quản trị viên của mình có thể xóa người dùng và chuyển hướng người dùng đến trang danh sách người dùng này. Nhưng khi tôi nhấp vào liên kết để tiêu diệt một người dùng cụ thể, nó chỉ chuyển hướng đến trang hồ sơ người dùng và không xóa người dùng khỏi cơ sở dữ liệu.

Có ai biết tại sao không?

** CẬP NHẬT: Đã cập nhật mã bên dưới như được đề xuất và hoạt động ngay bây giờ.

users_controller.rb

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

    if @user.destroy 
     redirect_to root_url, notice: "User deleted." 
    end 
    end 

người dùng/index.html.erb

<div class = "container"> 
    <div id="usersview"> 
    <b>USERS DIRECTORY</b> 
    <%= render @users %> 
</div> 

<center> 
    <%= will_paginate @users %> 
</center> 
</div> 

người dùng/_user.html.erb

<div class="comments"> 
    <%= link_to user.name, user %> 
    <% if current_user.try(:admin?) && !current_user?(user) %> 
     <%= link_to "Destroy", admin_destroy_user_path(user), method: :delete, data: { confirm: "You sure?" } %> 
    <% end %> 
</div> 

routes.rb

devise_for :users  
match 'users/:id' => 'users#destroy', :via => :delete, :as => :admin_destroy_user 
match 'users/:id' => 'users#show', as: :user 
resources :users 

Trả lời

10

Devise không cung cấp chức năng này ra khỏi hộp. Bạn đã tạo ra hành động tiêu diệt riêng của mình, nhưng bạn cũng phải tạo một tuyến tùy chỉnh cho hành động đó.

Trong các tuyến đường của bạn:

match 'users/:id' => 'users#destroy', :via => :delete, :as => :admin_destroy_user 

Và sau đó khi tạo liên kết:

<%= link_to "Destroy", admin_destroy_user_path(user), method: :delete, data: { confirm: "You sure?" } %> 
+0

Tôi đã cập nhật (xem câu hỏi đã chỉnh sửa) như bạn đã lưu ý nhưng cùng một kết quả.Không phá hủy và lộ trình để hiển thị trang. Có thể tuyến đường của tôi không đúng thứ tự không? – spl

+0

thử đặt tuyến tùy chỉnh phía trên lệnh gọi 'devise_for'. – AlexBrand

+0

Tôi không nghĩ rằng bạn cần có tài nguyên ': users' – AlexBrand

3

Tôi nghĩ rằng bạn có trong routes.rb của bạn: resources :users

Vấn đề là bạn có không chuyển người dùng mà bạn muốn xóa khi nhấp:

người dùng/_user.html.erb

<%= link_to "Destroy", user, method: :delete, data: { confirm: "You sure?" } %> 

Thấy rằng trong param thứ hai tôi đã thêm dùng thay vì USER_URL.

users_controller.rb

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

    if @user.destroy 
     redirect_to root_url, notice: "User deleted." 
    end 
    end 

Trong điều khiển Tôi đã gỡ bỏ một @ user.destroy. Bạn đã gọi nó hai lần.

Hy vọng điều đó sẽ hữu ích!

0

Hoặc từ đường ray c bạn có thể làm điều gì đó như thế này trong đó "x" là id người dùng.

user = User.where(id: x) 
user.destroy(1) 
2

Theo 4,1 rake tuyến đường và chế độ xem, sử dụng như sau sẽ giúp bạn xóa tài khoản khi đã đăng nhập với tư cách người dùng.

<%= link_to "Cancel my account", registration_path(current_user), data: { confirm: "Are you sure?" }, method: :delete %>