允许管理员激活或停用用户-- Rails
Allow admin to activate or deactivate users-- Rails
我已经设法制作了一个仅用于注册和登录的应用程序。目前,我允许用户通过邮件帐户激活(遵循本教程:https://www.railstutorial.org/book/account_activation_password_reset 和 'rails generate controller AccountActivations --no-test-framework') 但我希望管理员能够激活或停用用户。在我的用户模型中,我设法定义了两种方法:
def activate_account!
update_attribute :is_active, true
end
def deactivate_account!
update_attribute :is_active, false
end
在我的用户部分视图中,我设法
<% if current_user.admin? && !current_user?(user) %>
<%= button_to "Deactivate", user, data: { confirm: "Are you sure?" } %>
<% end %>
我的路线是这样的:
get 'password_resets/new'
get 'password_resets/edit'
root 'static_pages#home'
get 'help' = 'static_pages#help'
get 'about' = 'static_pages#about'
get 'contact' = 'static_pages#contact'
get 'signup' = 'users#new'
get 'login' = 'sessions#new'
post 'login' = 'sessions#create'
delete 'logout' = 'sessions#destroy'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
问题是我不知道如何进行。我不想使用 Devise 或 CanCan,因为作为初学者,我想知道如何手动完成。请帮助我从应用程序中实现用户的激活和停用(管理员只能这样做)。
好的,首先阅读 Hartl 的 Rails 教程的 chapters 9 and 10。
为用户添加管理员标志
rails g migration add_admin_to_users admin:boolean
这会给你 .admin?
"for free" 因为 Active Record 会生成这个方法。
我会这样写你的按钮
<% if current_user.admin? && @user != current_user %> <%=link_to "deactivate", deactivate_path(user_id: @user), method: :post, data: { confirm: "Are you sure?" } %> <% end %>
然后在你的控制器中:
def deactivate
user = User.find(params[:user_id])
if current_user.admin?
user.deactivate_account!
redirect_to users_path
else
redirect_to :back
end
end
在你的路线中,类似:
post "/deactivate", to: "users#deactivate"
无论如何,我给你一个粗略的指南,但请务必阅读 Hartl 的教程,因为你的用例几乎涵盖在那里。
祝你好运!
根据Rails惯例:
PUT is used for updating an existing resource
POST is used for creating a new resource
因此,您应该将其设为 PUT
请求而不是 POST
,因为它正在更新 user
记录。
你应该这样定义你的路线:
put 'deactivate/:id(.:format)', :to => 'users#deactivate', :as => :deactivate_user
并且,在您的 user
部分中:
<%=link_to "Deactivate", deactivate_user_path(user), method: :put, data: { confirm: "You sure?" }%>
现在一切都应该可以使用您现有的代码。
我已经设法制作了一个仅用于注册和登录的应用程序。目前,我允许用户通过邮件帐户激活(遵循本教程:https://www.railstutorial.org/book/account_activation_password_reset 和 'rails generate controller AccountActivations --no-test-framework') 但我希望管理员能够激活或停用用户。在我的用户模型中,我设法定义了两种方法:
def activate_account!
update_attribute :is_active, true
end
def deactivate_account!
update_attribute :is_active, false
end
在我的用户部分视图中,我设法
<% if current_user.admin? && !current_user?(user) %>
<%= button_to "Deactivate", user, data: { confirm: "Are you sure?" } %>
<% end %>
我的路线是这样的:
get 'password_resets/new'
get 'password_resets/edit'
root 'static_pages#home'
get 'help' = 'static_pages#help'
get 'about' = 'static_pages#about'
get 'contact' = 'static_pages#contact'
get 'signup' = 'users#new'
get 'login' = 'sessions#new'
post 'login' = 'sessions#create'
delete 'logout' = 'sessions#destroy'
resources :users
resources :account_activations, only: [:edit]
resources :password_resets, only: [:new, :create, :edit, :update]
问题是我不知道如何进行。我不想使用 Devise 或 CanCan,因为作为初学者,我想知道如何手动完成。请帮助我从应用程序中实现用户的激活和停用(管理员只能这样做)。
好的,首先阅读 Hartl 的 Rails 教程的 chapters 9 and 10。
为用户添加管理员标志
rails g migration add_admin_to_users admin:boolean
这会给你 .admin?
"for free" 因为 Active Record 会生成这个方法。
我会这样写你的按钮
<% if current_user.admin? && @user != current_user %> <%=link_to "deactivate", deactivate_path(user_id: @user), method: :post, data: { confirm: "Are you sure?" } %> <% end %>
然后在你的控制器中:
def deactivate
user = User.find(params[:user_id])
if current_user.admin?
user.deactivate_account!
redirect_to users_path
else
redirect_to :back
end
end
在你的路线中,类似:
post "/deactivate", to: "users#deactivate"
无论如何,我给你一个粗略的指南,但请务必阅读 Hartl 的教程,因为你的用例几乎涵盖在那里。
祝你好运!
根据Rails惯例:
PUT is used for updating an existing resource
POST is used for creating a new resource
因此,您应该将其设为 PUT
请求而不是 POST
,因为它正在更新 user
记录。
你应该这样定义你的路线:
put 'deactivate/:id(.:format)', :to => 'users#deactivate', :as => :deactivate_user
并且,在您的 user
部分中:
<%=link_to "Deactivate", deactivate_user_path(user), method: :put, data: { confirm: "You sure?" }%>
现在一切都应该可以使用您现有的代码。