Rails:Postgres处理where子句 - JSON格式的错误

时间:2016-02-29 07:25:46

标签: ruby-on-rails

嗨我有一个模型books,下面提到的方法:

def self.text_search(query)
    pry
    if query.present?
        where("title @@ :q or author @@ :q", q: query)
    else
        find(-1)
    end
end

在我的控制器中,我将响应发送给客户端为JSON:

render json: @books

如果查询返回某些内容,此代码可以正常工作。如果没有,我无法发送JSON响应。我得到template missint error。 如何在JSON中处理它?<​​/ p>

我试过

class BooksController < ApplicationController
    def index
        @books = Book.text_search(params[:query])
        @author= Author.find(Shelf.find(@books.map(&:isbn).uniq).map(&:author_id))
        rescue ActiveRecord::RecordNotFound  #donothing

        render json: @books
    end
end

2 个答案:

答案 0 :(得分:3)

def self.text_search(query)
  if query.present?
    where("title @@ :q or author @@ :q", q: query)
  else
    Book.none
  end
end

应该做的伎俩。 Book.none返回一个空的ActiveRecord :: Relation。

另外,我不知道为什么在你只渲染@books时分配作者。

@author= Author.find(Shelf.find(@books.map(&:isbn).uniq).map(&:author_id))
如果不存在匹配的记录,

将引发ActiveRecord :: RecordNotFound。考虑使用find_by id: []

答案 1 :(得分:0)

我喜欢来自tobmatth的想法。但是,我也相信你应该避免在代码的正常(预期)流程中抛出(和处理)异常。

所以,我也建议像:

class BooksController < ApplicationController
  def index
    @books = Book.text_search(params[:query])
    if @books.count > 0
      @author= Author.find(Shelf.find(@books.map(&:isbn).uniq).map(&:author_id))
    end

    render json: @books

  end
end

我认为这可能适用于您的原始代码(也许?)。