如何在Rails中使用before_action?

时间:2016-01-20 00:17:55

标签: ruby-on-rails ruby authentication

我的控制器中有一些方法。 首先我写

before_action :require_user
before_action :require_rights, only: [:show, :my_method]

我可以动态放置方法吗?例如

before_action :require_rights, only: current_user.allowed_actions

我认为在某处保存方法名称并将每个用户配置为具有访问权限的组。或者现有宝石有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

你可以试试这个:

#controller
before_action :require_rights

def require_rights
  unless current_user.allowed_actions
    raise 'not authorized'
  end
end

让你的方法中的条件可以解决你的问题。

答案 1 :(得分:0)

你可以这样做。

before_action :require_user
before_action :require_rights


def require_rights
  fail 'Not allowed' unless current_user.allowed_actions.include?(action_name) # Guard to check if user allowed to do certain action
end

另外,我建议你创建一个特殊的类来为你处理这个逻辑。例如:

class RightsPolicyService
  attr_reader :user

  def initialize(user)
    @user = user
  end

  def allowed?(controller_name, action_name)
    # Define here your custom logic for checking if user is allowed
    user.allowed_controllers.include?(controller_name) &&
      user.allowed_actions.include?(action_name)
  end
end

# And in the controller
def require_rights
  fail 'Not allowed' unless RightsPolicyService.new(current_user).allowed?(controller_name, action_name)
end

注意:失败只是一个例子,您应该在这种情况下生成响应或在某处重定向。