【问题标题】:How can I set a variable to a value, only if that value is valid?仅当该值有效时,如何将变量设置为值?
【发布时间】:2016-08-27 23:15:29
【问题描述】:

我想将变量设置为给定值,但前提是该值有效。

现在这是我的代码:

if Something.find(params[:id].comments.first.exists?
  @comment = Something.find(params[:id]).comments.first
else
  @comment = nil
end

但这效率低下,因为它必须加载两次记录。

我尝试使用 ruby​​ 方法try 来确保变量只有在值有效时才会被设置:

@comment = Something.try.find(params[:id]).comments.first

但无论我把它放在哪里,我都会返回“nil 不是符号”错误。似乎try 仅用于打印变量。

任何人都知道我还能如何仅通过一个查询来完成此操作?

【问题讨论】:

  • 如果您的查询失败,默认情况下您会得到一个nil。事后运行您的单个查询并测试nil
  • @MarsAtomic 如果查询失败,我会收到整个页面的“找不到记录”错误。
  • rv = Something.find(params[:id]).comments.first; @comment = rv.exists? : rv : nil。您在第一行代码中缺少正确的括号。

标签: ruby-on-rails ruby


【解决方案1】:

你试过了吗?

if @comment = Something.find(params[:id]).comments.first
    # do something with your @comment variable
else
    # do something else
end

更多示例:Check if record exists from controller in Rails

【讨论】:

  • 这种形式很容易被读者混淆用于相等测试。如果您要这样做,那么我建议至少将整个表达式括起来,以提供视觉提示,即这里有一些不同的东西:if (@comment = Something.find(params[:id]).comments.first)
【解决方案2】:

你可以试试:

@comment = Comment.find_by(something_id: params[:id])

【讨论】:

    【解决方案3】:
    # Attempt your query
    
    @comment = Something.find(params[:id]).comments.first
    
    # If the record does not exist, use rescue to handle the exception gracefully
    
    rescue ActiveRecord::RecordNotFound
      # Handle the exception
      @comment = nil
    end
    

    您可以找到更多关于异常和异常处理的信息here

    【讨论】:

      【解决方案4】:

      我想这就是你想要的:

      @comment = Something.find_by(id: params[:id]).try(:comments).try(:first)
      

      在这种情况下find_by 将返回Something 对象或nil。在 nil 的情况下,try 链仍将返回 nil,而在 object 的情况下,try 中的方法将被执行并给出第一个注释,如果存在的话(注意!如果对象存在,你可能仍然会得到一个 nil,因为该对象可能没有任何 cmets)。

      因此,只有在Something 对象存在并且它具有cmets 时,您才会设置@comment;否则,它将为零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2021-04-03
        • 1970-01-01
        • 2012-09-05
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        相关资源
        最近更新 更多