Ruby / Rails,Gate子句语法来实施安全策略

我有一个很难解决的问题。

我想复制title_with_if_statement方法的结果,但要使用title方法中使用的语法。但是,我不知道要在enforce_policy_to_level()方法中添加什么来完成此操作。

我可以执行'title_less_可读性',但是由于该策略位于顶部,因此我发现title方法更具可读性,并且由于我将针对数百种方法进行此操作,因此我希望保持其DRY和可读性。 / p>

有什么建议吗?

这甚至可能吗?基本上,这是一个before_action,但是使用方法本身的结果。

class Car

  def title
    enforce_policy_to_level(1)
   # Code that returns the "Car Title" string
   "Car Title"
  end

  def title_less_readable
    # Code that returns "Car Title" string
    content = "Car Title"
    return secure_text(content) unless authorized_to_level?(1)
    content
  end

  def title_with_if_statement
    # Code that returns the "Car Title" string
    content = "Car Title"
    if authorized_to_level?(1)
      content
    else
      secure_text(content)
    end
  end

  private

  def enforce_policy_to_level(level)
    # Return from title method with the secured result of title method
    # if it's not authorized. In this example it would be secure_text('Car Title')
    # which output return '---------'
    # If if authorized,just continue with how title method would normally return
  end

  def authorized_to_level?(level)
    current_user_level = 1 # Dynamic from user record
    current_user_level >= level
  end

  def secure_text(text)
    'X' * text.length
  end

end
wjswcj 回答:Ruby / Rails,Gate子句语法来实施安全策略

为什么不只是这样?

  def title
    enforce_policy_to_level(1) do
      "Car Title"
    end
  end

  private

  def enforce_policy_to_level(level,&block)
    if authorized_to_level?(level)
      secure_txt yield
    else
      yield
    end
  end
,

请考虑一下您的关注点:我会通过创建一个单独的函数来处理授权的方法。

Emoji with the physical keyboard

module AuthorizedText module_function def secure_text(text,authorized) return authorized ? text : 'X' * text.length end end 中这样调用:

Car

您可以使用一种便捷的方法来简化此操作:

AuthorizedText.secure_text("Car Title",authorized_to_level(1))

使您的def secure(level,text) AuthorizedText.secure_text(text,authorized_to_level(level)) end 方法看起来像

car_title

可以通过定义允许您执行类似操作的类方法来概括方法包装器

def car_title
  secure(1,"Car Title")
end

但是我会称其为过度设计,并且最终对不是您的人(包括从现在起8个月内包括您在内)的可读性降低。我会尽量避免像这样花哨的那样有趣。

此外,如果def car_title "Car Title" end secure :car_title current_usercurrent_user_level的上下文之外有意义,并且您可能想在其他地方重用它,则可以通过将auth检查方法移至{{ 1}},如果合适的话:

Car
本文链接:https://www.f2er.com/3135858.html

大家都在问