问题描述
我有一个控制器方法来验证已收到带有令牌的链接的用户(请参阅底部的方法).我有一个集成测试:
I have a controller method to authenticate a user who has received a link with a token (see method at the bottom). I have an integration test:
def test
get login_path('invalid token') // Login_path routes to the controller method below.
assert flash[:danger]
assert_redirected_to root_path
end
此测试产生以下错误(指的是get login_path('invalid token')
):
This test produces the following error (referring to get login_path('invalid token')
):
ActionView::MissingTemplate: Missing template invitations/login, application/login with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :coffee, :jbuilder]}.
视图invitiations/login
确实不存在.但是,鉴于以下控制器方法,永远都不需要这样的视图(它总是重定向到root_path
或呈现profiles/show
).是什么原因导致此错误?
The view invitiations/login
indeed doesn't exist. However, such a view should never be needed given the controller method below (it always either redirects to the root_path
or renders profiles/show
). What could be causing this error?
控制器方法:
def login
inv = Invitation.where('email = ?', params[:email])
if inv
inv.each do |person|
if person.authenticated?(:invitation, params[:id])
@organization = person.organization
unless @organization.nil?
render 'profiles/show' and return
else
flash[:danger] = "Error"
redirect_to root_path and return
end
end
flash[:danger] = "Invalid link"
redirect_to root_path
end
else
flash[:danger] = "Invalid link"
redirect_to root_path
end
end
P.S.该测试过去一直通过,即直到我重写控制器方法以适应多个inv
为止(请参阅使用find_by方法检索多个记录).
P.S. The test used to pass, i.e. until I rewrote the controller method to accommodate for multiple inv
's (see Retrieve multiple records with find_by method).
推荐答案
您使用if inv
-如果不存在带有匹配电子邮件的邀请,由于inv
是ActiveRecord查询对象,它仍将返回true
.但是each
然后什么也不做,即没有重定向或显式呈现.默认渲染将被调用,并期望模板存在.
You use if inv
- this will still return true
if no invitations with matching email exist, since inv
is an ActiveRecord query object. But then the each
does nothing, i.e. does not redirect or render explicitly. Default render will be invoked and expect a template to exist.
使用if inv.present?
将解决此问题.
(此外,您可能要确保inv
集合仅包含一个结果.在同一请求中多次重定向或渲染将导致错误.)
(Also, you might want to make sure the inv
collection only contains one result. Redirecting or rendering multiple times in the same request will result in an error.)
这篇关于为什么需要此视图模板?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!