【问题标题】:rails friendly_id and check if entry existsrails friendly_id 并检查条目是否存在
【发布时间】:2011-03-13 14:36:07
【问题描述】:

如何在获取之前检查friendly_id条目是否存在?

例如:

  def book
   @book = Book.find(params[:book_id])
  end

没关系,但我想先检查一下是否有friendly_id,比如:

def book
  if Book.exists?(params[:book_id])
    @book = Book.find(params[:book_id])
  else
    #404 not found
  end

【问题讨论】:

    标签: ruby-on-rails ruby friendly-id


    【解决方案1】:

    截至friendly_id gem 的最新版本,您可以说:

    Book.friendly.exists? params[:book_id]
    

    【讨论】:

    • 这比公认的答案要好得多。例外应该只针对您无法轻易预测的事情——而不是您期望发生的事情。
    • 如果你使用 :finders 你可能会省略友好,导致Book.exists? params[:book_id]
    • 危险。任何以数字开头的 slug 都会返回误报,因为它会依赖 ActiveRecord 的查找器,并且 "1something".to_i == 1
    • @StephenCorwin 是的,这就是我不将“finders”模块混入我的模型的原因。
    【解决方案2】:

    从 RecordNotFound 异常中拯救 ==>

    def book
      @book = Book.find(params[:book_id])
      #OK
    rescue ActiveRecord::RecordNotFound => e
      head :not_found
    end
    

    【讨论】:

    • find_by_id 将返回实例或零。而findfind_by_id 会引发异常
    • 谢谢,更正了答案。复制粘贴总是出问题!!
    【解决方案3】:

    我建议你像我一样将 Deepak N 的解决方案转移到模型中:

    def self.find_by_friendly_id(friendly_id)
      find(friendly_id)
    rescue ActiveRecord::RecordNotFound => e
      nil
    end
    

    所以现在它将通过 id 和 slug 获取您的书籍,并且不会抛出异常,就像标准 AR 方法 #find_by_id 一样。
    顺便说一句,根据documentation #exists? 现在的方法是检查记录存在的正确方法!

    【讨论】:

      【解决方案4】:
      @book = Book.find_by_id(params[:book_id])
      if @book
        # OK
      else
        #404 not found
      enв
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-09
        • 2014-11-20
        • 2011-09-29
        • 1970-01-01
        相关资源
        最近更新 更多