方法与?名义上不会在专家政策中引发任何方法错误
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 方法不能有多个问号,那么我如何告诉我的政策这是该方法?
我正在使用
- Ruby2.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 进行授权之前,我能够从我的前端应用程序中达到这个终点。
策略方法是通过在控制器操作名称的末尾附加 ?
来确定的。您的控制器操作名称应该 而不是 以 ?
结尾,因为这不会构成正确的 URI 路径。
虽然您的 post 没有显示任何控制器代码,但有问题的测试应该显示 get :is_logged_in
。
我正在使用 Pundit,但找不到如何在我的策略中设置以问号结尾的方法。
我的会话控制器中有一个名为 is_logged_in 的方法?在会话策略中,我有相同的方法和与之关联的正确安全逻辑。但是,当我尝试访问该方法时,出现了这些错误,因为策略找不到该方法:
Minitest::UnexpectedError: NoMethodError: undefined method is_logged_in?? for #<SessionPolicy:0x007f9530200bd0>
当然 rails 方法不能有多个问号,那么我如何告诉我的政策这是该方法?
我正在使用
- Ruby2.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 进行授权之前,我能够从我的前端应用程序中达到这个终点。
策略方法是通过在控制器操作名称的末尾附加 ?
来确定的。您的控制器操作名称应该 而不是 以 ?
结尾,因为这不会构成正确的 URI 路径。
虽然您的 post 没有显示任何控制器代码,但有问题的测试应该显示 get :is_logged_in
。