2

我正在尝试使用 mongoid 和 mongodb 而不是普通数据库来完成 Michael Hartl 的 rails4 教程。我已经到了必须设置用户登录和注销的地方,这就是我遇到的问题。下面是我用来检查用户电子邮件是否已注册的代码。

user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
  # sign in and load user page
else
  flash[:error] = 'Invalid email/password combination'
  render 'new'
  # error and re-render signin
end

不幸的是,我遇到了一个未找到的文档,因为这是当查询变为空白时返回的内容。它应该进入 else 但我得到一个 rails 错误页面,该页面返回未找到的 mongoid 错误文档。如何避免这种情况并让代码执行 else 语句中的内容?

谢谢!

4

1 回答 1

5

Mongoid 有raise_not_found_error设置选项,当设置为 false 时,强制 mongoid 不抛出上面提到的错误。可以在文档页面上找到更多详细信息。因此,如果您想手动处理应用程序中的所有 Mongoid::Errors::DocumentNotFound 错误,只需在 mongoid.yaml 中添加以下行:

raise_not_found_error: false

如果您希望 mongoid 不在当前操作中引发错误,您可以在 find_by 方法调用之后调用救援,然后检查用户变量是否为零:

user = User.find_by(email: params[:session][:email].downcase) rescue nil
if !user.nil? && ...
  ...
else
  ...
end
于 2013-09-26T08:03:00.600 回答