【问题标题】:Method with ? in name throws no method errors in pundit policy方法与?名义上不会在权威政策中引发方法错误
【发布时间】:2019-12-25 19:42:33
【问题描述】:

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

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

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

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

我正在使用

  • Ruby 2.3.3
  • Rails 4.2.7.1
  • 权威 2.1.0

政策:

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 进行授权之前,我能够从我的前端应用程序中达到这个端点。

【问题讨论】:

  • 不幸的是我试过了,但没有用:(

标签: ruby-on-rails ruby pundit


【解决方案1】:

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

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

【讨论】:

  • 哦,我没有意识到,因为我的路由文件中的 URL 没有?作为路径的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 2021-01-13
  • 2020-01-16
  • 1970-01-01
相关资源
最近更新 更多