ruby 如果作用域在rails中失败了,有没有办法返回一条消息?

iqjalb3h  于 12个月前  发布在  Ruby
关注(0)|答案(4)|浏览(98)

我在我的rails项目中有一个User模型,在模式中有一个名为active的字段,它表示用户是否活跃,我添加了一个像这样的范围

# app/models/user.rb
scope :active, -> { where active: true }

我的用例很简单,我想找到一个像这样活跃的用户:

user = User.active.find_by!(token: token)

问题是我想避免使用beginrescue来捕获ActiveRecord::RecordNotFound错误
我想要的是不抛出这个异常,而不是像我们使用

validates :xyz, message: "invalid input"

有没有可能的方法来实现这一目标?

h79rfbju

h79rfbju1#

如果你不想捕获异常--只需要使用方法find_by
带有bang(find_by!save!create!first!等)的活动记录方法会引发错误

user = User.active.find_by(username: username)

if user.present?
  # do something with user
else
  # do something else
end
6ioyuze2

6ioyuze23#

如果我从你的评论中理解正确的话,你有三种不同的情况:
1.具有给定令牌的用户存在且处于活动状态:设置current_user = user
1.具有给定令牌的用户存在,但不处于活动状态:写“用户不活跃”。
1.具有给定令牌的用户不存在:写上“未经授权”
我们不能用一次检查来区分三个病例。我们必须使用if ... elsif ... else,或者同时使用if ... else ...和一个异常和一个救援块。
或者,考虑是否可以将所有错误情况合并为一个。我们真的关心区分“用户不活跃”和“未经授权”吗?

current_user = User.active.find_by(token: token)
puts 'Inactive or unauthorized' if current_user.nil?
9rygscc1

9rygscc14#

在阅读了对帖子本身的评论和答案后,我发现了一件有趣的事情。下面是你提供的代码:

user = User.active.find_by(token: "xyz")
if user
    current_user = user
elsif !user&.active? 
    puts "user not active" 
else 
    puts "unauthroized"
end

首先,如果你使用一个作用域作为active -你不需要检查elsif !user&.active?,因为它总是为false,因为作用域只能返回一个有active用户的结果。这意味着如果你想告诉用户是否处于非活动状态,你不能使用activescope。所以我们只剩下常规的find_by。在这种情况下,美化代码的更好方法是在控制器中创建一个助手函数,它将处理消息和设置用户。这样的东西可能对你有用:

# your_controller.rb
# for this you will have to have templates with the names :unauthorized and :inactive
def index
    #...
    err = check_and_set_user(token)
    return render err if err
    #...
end

private
def check_and_set_user(token)
    user = User.find_by(token: "xyz")
    return "unauthorized" unless user
    return "inactive" unless user.active
    
    current_user = user
    nil
end
helper_method :check_and_set_user

或者你甚至可以把它作为一个单独的before_filter,无论如何你都能理解。

相关问题