我在我的rails项目中有一个User
模型,在模式中有一个名为active
的字段,它表示用户是否活跃,我添加了一个像这样的范围
# app/models/user.rb
scope :active, -> { where active: true }
我的用例很简单,我想找到一个像这样活跃的用户:
user = User.active.find_by!(token: token)
问题是我想避免使用begin
和rescue
来捕获ActiveRecord::RecordNotFound
错误
我想要的是不抛出这个异常,而不是像我们使用
validates :xyz, message: "invalid input"
有没有可能的方法来实现这一目标?
4条答案
按热度按时间h79rfbju1#
如果你不想捕获异常--只需要使用方法
find_by
带有bang(
find_by!
、save!
、create!
、first!
等)的活动记录方法会引发错误w6lpcovy2#
是的。你要找的是
rescue_from
https://apidock.com/rails/ActiveSupport/Rescuable/ClassMethods/rescue_fromhttps://api.rubyonrails.org/classes/ActiveSupport/Rescuable/ClassMethods.html
给你们举个例子https://rubytutorial.io/rails-rescue_from/
6ioyuze23#
如果我从你的评论中理解正确的话,你有三种不同的情况:
1.具有给定令牌的用户存在且处于活动状态:设置
current_user = user
。1.具有给定令牌的用户存在,但不处于活动状态:写“用户不活跃”。
1.具有给定令牌的用户不存在:写上“未经授权”
我们不能用一次检查来区分三个病例。我们必须使用
if ... elsif ... else
,或者同时使用if ... else ...
和一个异常和一个救援块。或者,考虑是否可以将所有错误情况合并为一个。我们真的关心区分“用户不活跃”和“未经授权”吗?
9rygscc14#
在阅读了对帖子本身的评论和答案后,我发现了一件有趣的事情。下面是你提供的代码:
首先,如果你使用一个作用域作为active -你不需要检查
elsif !user&.active?
,因为它总是为false,因为作用域只能返回一个有active用户的结果。这意味着如果你想告诉用户是否处于非活动状态,你不能使用activescope。所以我们只剩下常规的find_by。在这种情况下,美化代码的更好方法是在控制器中创建一个助手函数,它将处理消息和设置用户。这样的东西可能对你有用:或者你甚至可以把它作为一个单独的before_filter,无论如何你都能理解。