Rails调用意外的控制器操作而不是重定向

时间:2014-06-20 13:52:56

标签: ruby-on-rails

我认为这是我应用程序中最奇怪的错误。

我的应用程序可以让您注册。注册后,它会向您发送一封激活电子邮件,其中包含激活您帐户的链接。链接如下所示:

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 IDlocation操作如下所示:

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'

1 个答案:

答案 0 :(得分:0)

好吧,这似乎与行动的名称有关:位置

当我将def location更改为def map时,现在一切正常。

我希望这在某些方面对某人有帮助!