设计宝石 - 不清楚"操作方法"指南

时间:2016-10-25 16:00:35

标签: ruby-on-rails devise

这篇文章是指Devise wiki中的以下操作指南:要求admin在sign_in之前激活帐户

link to how-to guide

我已经为我的应用程序设置了Devise身份验证,没有任何问题,一切都运行良好。

但是,由于该应用仅供内部使用,因此我希望管理员在sign_in之前激活新帐户。

因此,我一直在尝试按照"如何"中所述的逐步说明进行操作。文章,但我遇到了一些我想澄清的问题:

1)型号变更:

在模型更改下,系统会要求:

"然后,覆盖模型中的以下方法(User.rb):"

def active_for_authentication? 
    super && approved? 
end 

def inactive_message 
    if !approved? 
      :not_approved 
    else 
      super # Use whatever other message 
    end 
end

- >我在这里的困惑来自于使用“#34; Override"”这个词。我应该简单地将它添加到model / user.rb文件中吗?无需其他更改。

以下步骤要求您:

"您需要在i18n文件中创建一个条目:not_approved和:signed_up_but_not_approved,位于config / locales / devise。##。yml:"

devise:
    registrations:
      user:
        signed_up_but_not_approved: 'You have signed up successfully but your account has not been approved by your administrator yet'
failure:
    not_approved: 'Your account has not been approved by your administrator yet.'

- >我的问题是如何正确地将它们添加到yml文件中。我是否将它集成到现有代码中(即添加用户:...在现有注册:)下,或者只是将其添加到顶部 - 包括"设计:"?

2)控制器和视图

第一部分要求其中一个执行以下操作:

"您想要创建一个只有管理员可访问的控制器方法,列出未经批准的用户,并提供一种简单的批准方式。"

- >我的问题是我们在谈论哪个控制器? Devise不会创建一个可编辑的控制器......我是否会生成一个名为user_controller的设备,或者它会与设备中的控制器发生冲突?

- > ......在这种情况下,它应该从设计控制器继承吗?

- >或者,我可以将代码完全添加到另一个控制器,然后用于访问新方法吗?不要这样做,因为它会弄乱我现有的一个控制器......

- >还提到了index.html.haml,其中一个是添加代码以显示来自用户模型的信息。这个页面(我的版本是html.erb)可以在任何你想显示用户状态信息的地方,只要它可以访问新的用户控制器方法吗?

3)电子邮件通知

- >一切似乎都很清楚......在这里,我应该考虑使用的电子邮件地址吗?在设置设计时,我添加了我的Gmail地址作为临时措施。这会使事情变得复杂吗?

4)重置密码说明

- >一切似乎都很清楚...添加到: app / models / user.rb

- >评论:似乎有很多东西被添加到user.rb模型中。

这完全是一个列表,但如果有人可以帮助我,我保证创建并发布一个更加用户友好的指南版本......任何新手都应该能够成功使用。

谢谢!

1 个答案:

答案 0 :(得分:1)

1。是的,您只是将这两种方法添加到资源模型中。

它覆盖了这些方法,不是因为你应该在你的模型中使用它们,而是因为它们已经存在于宝石中。

2。是的,你需要一个你创建的控制器。

你是对的,设计没有内置模板供你管理用户。所以,是的,您必须自己创建一个,或者如您所述,将其添加到现有控制器。例如,您可以拥有一个管理命名空间,它有几个控制器,包括一个用户可以帮助您管理它。

#routes.rb

namespace :admin do
  get '', to: 'dashboard#index', as: '/'  ## just an example to show a dashboard in your admin namespace
  get 'manage-users', to 'users#index'
end
#controllers/admin/users_controller.rb

class Admin::UsersController < ApplicationController
  layout 'dashboard' #custom layout for admins
  before_action :authenticate_user! #make sure they are logged in
  before_action :verify_admin #make sure they are an admin

    def index
      if params[:unapproved]
        @users.unapproved
      else
        @users = User.all
      end
    end

    private

    def verify_admin
      unless current_user.admin? # this implies that you have a method in user called admin? that checks for the admin role 
        flash.now[:warning] = "You do not have permission to be here.  If you feel this is an error please request permission from your administrator"
        redirect_to root_path
    end
end

因为操作是用户#index,那么页面将是views / admin / users / index.html.erb

然而 - 我发现对于像管理用户这样的管理员任务,我有更多请求将它直接放入仪表板控制器。而我只是做了

@unapproved_users = User.unapproved

在仪表板#index操作中,在仪表板上添加一个小部件,其中包含任何未批准用户的列表

然后在用户模型内部使用快速范围来获取未经批准的用户

class User < ActiveRecord::Base

  devise :invitable, :database_authenticatable, :registerable,   :omniauthable, 
     :recoverable, :rememberable, :trackable , :validatable , :confirmable

  scope :unapproved, -> { where(approved: false) } 
  # this works because if you followed the wiki you should have a migration that has a default of false and doesn't allow nil, so every record will either be true or false for approved

end

这样,在您的视图中,无论您将它放在何处,您都可以拥有一个带有用户列表的区域,每个用户都有一个复选框,该复选框会向该记录发出批准该用户的ajax更新请求。 e.g。

# views/admin/dashboard/index.html.erb or views/admin/users/index.html.erb or views/users/ .. etc, you get the idea, just make sure when it comes to managing users it's in a locked down place.

<table class="table table-striped" id="manage-users">
  <thead>
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Email</th>
      <th>Status</th>
    </tr>
  </thead>
  <tbody>
    <%- @users.each do |user| %>
      <tr id="user-<%= user.id %>">
        <td>
          <%= user.first_name %>
        </td>
        <td>
          <%= user.last_name %>
        </td>
        <td>
          <%= user.email %>
        </td>
        <td class="status">
          <%= user.approved ? "Approved" : check_box_tag('approved', true, false) %>
        </td>
      </tr>
    <% end %>
  </tbody>
</table>

然后喝点咖啡来获取更新

# javascripts/admin.coffee

->
  $('table#manage-users input[name=approved]').on 'change', ->
    uid = $(this).parent().parent().attr('id').replace(/user-/i, '')
    $.ajax
      type: 'PUT'
      dataType: 'json'
      url: '/admin/users/' + uid
      data: user: approved: true
      success: (data) ->
        user = 'user-' + uid
        $('tr#' + user).find('td.status').html 'Approved'
        return
    return
  return

在大多数情况下,当您处理设计时,您不需要用户控制器,因为它会为您处理。但是在管理员中使用用户控制器是阻止非管理员用户访问并且仍然允许管理的简单方法。再加上它很安静。

3 Gmail就好了。

您使用的是哪个电子邮件地址无关紧要。只要您正确设置了电子邮件以便活动邮件程序可以发送,您就可以了。

4相关性几乎就是这里的一切。

现代(截至目前)的思想是,如果它与数据的查找/验证/持久性有关,那么它可以进入模型,如果它的简单复杂的业务逻辑,它可能应该是服务对象