允许管理员激活或停用用户 - Rails

时间:2015-08-10 01:40:54

标签: ruby-on-rails ruby admin activation

我设法创建了一个仅用于注册和登录的应用。目前,我通过邮件帐户激活用户(遵循本教程:https://www.railstutorial.org/book/account_activation_password_reset和& #39; rails生成控制器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,因为作为初学者,我想知道如何手动完成。请帮助我实现从应用程序激活和停用用户(Admin只能这样)。

Here is my app.

2 个答案:

答案 0 :(得分:5)

好的,先阅读Hartl's Rails Tutorial的chapters 9 and 10

向用户添加和管理标记

rails g migration add_admin_to_users admin:boolean

这将免费提供.admin?“,因为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的教程,因为你的用例几乎都在那里。

祝你好运!

答案 1 :(得分:1)

根据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?" }%> 部分:

private class ResponseData {
   public boolean success;
   public List<User> data;
}

private class User {
   public String id;
   public String username;
}

现在一切都应该与您现有的代码一起使用。