方法与?名义上不会在专家政策中引发任何方法错误

Method with ? in name throws no method errors in pundit policy

我正在使用 Pundit,但找不到如何在我的策略中设置以问号结尾的方法。

我的会话控制器中有一个名为 is_logged_in 的方法?在会话策略中,我有相同的方法和与之关联的正确安全逻辑。但是,当我尝试访问该方法时,出现了这些错误,因为策略找不到该方法:

Minitest::UnexpectedError: NoMethodError: undefined method is_logged_in?? for #<SessionPolicy:0x007f9530200bd0>

当然 rails 方法不能有多个问号,那么我如何告诉我的政策这是该方法?

我正在使用

政策:

class SessionPolicy < ApplicationPolicy
  def create?
    true
  end

  def new?
    true
  end

  def destroy?
    true
  end

  def is_logged_in?
    true
  end
end

正在使用 (Minitest) 进行测试:

 test "is_logged_in? should return false when NOT logged in" do
    sign_out get_user
    get :is_logged_in?
    assert_response :ok
    response = response_to_json
    assert !response[:logged_in]
    assert !response[:is_business]
  end

API:

def is_logged_in?
    payload = {
      logged_in: !current_user.nil?,
      is_business: current_user.try(:is_business?)
    }
    render json: payload, status: :ok
  end

除了这个单元测试之外,在使用 Pundit 进行授权之前,我能够从我的前端应用程序中达到这个终点。

策略方法是通过在控制器操作名称的末尾附加 ? 来确定的。您的控制器操作名称应该 而不是 ? 结尾,因为这不会构成正确的 URI 路径。

虽然您的 post 没有显示任何控制器代码,但有问题的测试应该显示 get :is_logged_in