【问题标题】:Rails - how to check if key and value in a hash match given parameters?Rails - 如何检查哈希中的键和值是否与给定参数匹配?
【发布时间】:2023-03-08 00:36:02
【问题描述】:

我正在 Rails 4 应用程序中进行简单的授权。每个用户都有一个角色;然后我设置他们可以访问的页面,例如:

AUTH_MODERATOR_DEFINITIONS = {"articles"     => "index",
                              "readers"  => "index"}

然后,在控制器动作中,我将调用:

def index
  check_permissions(current_admin)
  ...
end

而在ApplicationController

  def check_permissions(current_admin)
    if current_admin.role == 1 # for moderators
      # find a pair key-vale AUTH_DISPATCHER_DEFINITIONS that matches `params[:controller]` and `params[:action]
    else
      redirect_to root_path, :alert => "No permission"
    end
  end

但是如何根据key AND value来查找hash呢?

提前谢谢你。

【问题讨论】:

    标签: ruby-on-rails ruby hash key


    【解决方案1】:

    你可以这样做:

    key = params[:controller]
    value= params[:action]
    p is_permitted = (AUTH_MODERATOR_DEFINITIONS[key] == value)
    

    但是,我认为您可能会在某个时候将散列中的值修改为数组,因为控制器不太可能只有一个操作,因此用户可以访问多个操作。例如:

    AUTH_MODERATOR_DEFINITIONS = {
        "articles" => "index",
        "readers"  => "index",
        "commenters"  => ["index","new","update"] # Added by me to show possible use case
    }
    

    考虑到上述情况,我认为您可以这样做。这将适用于两种情况(您的示例和我对该示例的扩展)

    key = params[:controller]
    value= params[:action]
    
    p is_permitted = [AUTH_MODERATOR_DEFINITIONS[key]].flatten.include?(value)
    

    【讨论】:

    • 这是最好的,因为它是 o(1)。
    • 你的第一个解决方案是我最喜欢的。
    • 你好魔杖,谢谢你的回答。我正在测试它,但输出仍然是false (p is_permitted),无论我是否在批准的页面上。我是否忽略了什么或我做错了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2011-04-16
    相关资源
    最近更新 更多