【问题标题】:How to hide checkboxes for user authorization如何隐藏用户授权的复选框
【发布时间】:2015-07-28 22:03:30
【问题描述】:

美好的一天,我正在使用 CanCanCan gem,这是一个 Ruby on Rails 的授权库,它限制了允许给定用户访问的资源。但是,当用户注册时,它可以正常工作,包括“管理员”和“禁止”在内的所有选项都会出现。我想隐藏这两个复选框并留下“客户”和“保姆”。我该怎么做?

用户.rb

class User < ActiveRecord::Base

  ROLES = %i[admin sitter customer banned]

  def roles=(roles)
    roles = [*roles].map { |r| r.to_sym }
    self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.inject(0, :+)
  end

  def roles
    ROLES.reject do |r|
      ((roles_mask.to_i || 0) & 2**ROLES.index(r)).zero?
    end
  end

  def has_role?(role)
    roles.include?(role)
  end

edit.html.erb

        <% for role in User::ROLES %>
          <%= check_box_tag "user[roles][#{role}]", role, @user.roles.include?(role), {:name => "user[roles][]"}%>
          <%= label_tag "user_roles_#{role}", role.to_s.humanize %><br />
        <% end %>
        <%= hidden_field_tag "user[roles][]", "" %>
      </div>
      </div>

https://github.com/CanCanCommunity/cancancan

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rubygems cancancan


    【解决方案1】:

    允许用户设置自己的角色可能是个坏主意,即使对于非特权角色也是如此。

    根据上下文猜测,您正在开发一个托儿应用程序,用户可以在其中注册为客户或保姆。您应该手动设置您的复选框,而不是根据您的 @roles 数组列表来构建它们,或者您可以创建一个 @public_roles 数组以在您的视图中使用,只包含非管理员角色。

    最后,由于某种原因,您有一个名为“banned”的角色,从技术上讲,它不是一个角色——它是一个用户状态,应该单独处理。

    【讨论】:

      【解决方案2】:

      在 edit.html.erb 中将 for role in User::ROLES 替换为 for role in %i[customer sitter]

      您应该考虑恶意用户也可能为其中一种受保护状态(adminbanned)制作自己的复选框。确保构建保护以确保用户不能将自己设置为admin,除非他们被允许。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-29
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多