嗨我有一个模型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
答案 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
我认为这可能适用于您的原始代码(也许?)。