我认为这是我应用程序中最奇怪的错误。
我的应用程序可以让您注册。注册后,它会向您发送一封激活电子邮件,其中包含激活您帐户的链接。链接如下所示:
http://localhost:3000/users/24932b7edf2e7cc7c9e8e51b8e7a7f75a88016f9/activate
,路线如下:
activate /users/:activation_code/activate(.:format) users#activate
单击该链接,它将在用户控制器中调用activate方法,如下所示:
def activate
@user = User.find_by_activation_code(params[:activation_code])
if @user.nil?
flash[:error] = "User not found or already activated. Try logging in"
else
@user.activate
flash[:success] = "User successfully activated"
end
redirect_to login_path
end
这是模糊的地方。该应用程序尝试在用户控制器中调用不同的操作,而不是重定向到login_path
,并且rails应用程序会阻塞。我只是不能为我的生活了解正在发生的事情。它尝试重定向到用户控制器中的location
操作而不是login_path
,然后失败并显示错误Couldn't find User without an ID
。 location
操作如下所示:
def location
@user = User.find(params[:id])
end
并且它自然会失败,因为在这种情况下URL中没有:id参数。这是堆栈跟踪的相关部分。第130行是对重定向的调用,然后调用位置操作。
app/controllers/users_controller.rb:38:in `location'
app/controllers/users_controller.rb:130:in `activate'
如果我删除或评论redirect_to login_path
,那么它不会尝试在我的用户控制器中调用位置方法,并且会回到激活操作的视图上,这不是存在。这是我的路线:
location_user GET /users/:id/location(.:format) users#location
login /login(.:format) sessions#new
有人有想法吗?
编辑:粘贴日志条目
Processing by UsersController#activate as HTML
Parameters: {"activation_code"=>"24932b7edf2e7cc7c9e8e51b8e7a7f75a88016f9"}
User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
CACHE (0.0ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
User Load (0.7ms) SELECT `users`.* FROM `users` WHERE `users`.`activation_code` = '24932b7edf2e7cc7c9e8e51b8e7a7f75a88016f9' LIMIT 1
Redirected to
Completed 404 Not Found in 29.4ms
ActiveRecord::RecordNotFound (Couldn't find User without an ID):
app/controllers/users_controller.rb:38:in `location'
app/controllers/users_controller.rb:130:in `activate'
答案 0 :(得分:0)
好吧,这似乎与行动的名称有关:位置
当我将def location
更改为def map
时,现在一切正常。
我希望这在某些方面对某人有帮助!