我希望在我的rails应用程序中通过JSON呈现所有文章的索引以及一篇完整的文章,但我在弄清楚如何做到这一点上遇到了一些麻烦。
这是我现在的控制器:
if params[:id]
@article = Article.find(params[:id])
else
@article = Article.published.not_draft.by_recent.first
end
respond_to do |format|
format.js { render :json => @article.to_json(
:except => [ :created_at, :updated_at, :draft, :id, :publish ],
:include => {
:comments => {
:only => [:body]
}
}),
:callback => params[:callback]}
end
我希望在响应中添加所有文章的索引,如下所示:
@index = Article.find(:all, :select => 'id, title')
我所能做到的唯一方法就是将索引和文章放入散列或数组中,然后将其放入JSON中。
@response = { :item => @article, :index => @index }
完整的代码都有:
@index = Article.find(:all, :select => 'id, title')
if params[:id]
@article = Article.find(params[:id])
else
@article = Article.published.not_draft.by_recent.first
end
@response = { :item => @article, :index => @index }
respond_to do |format|
format.js { render :json => @response.to_json(), :callback => params[:callback]}
end
这很好,除了现在我不能指定:include
或:except
并让它正确呈现。
发布于 2010-08-15 10:16:06
你在你的问题中暗示了解决方案。您很可能希望构建一个散列来呈现给JSON。现在最好的方法是为as_json方法提供一个实现。as_json提供了一种通过构建包含要编码的数据的散列来定制to_json输出的正式方法。
在Jonathan Julian's weblog上可以找到关于as_json和to_json如何交互的更全面的讨论。
发布于 2009-03-04 02:43:11
为了清楚起见,上面的代码使用:include和:except。工作,我的意思是它不会抛出错误。问题是它包含了索引中每一篇文章的注释。我只希望包含:item的注释,而不是索引中列出的任何文章。
我不能让嵌套作为散列或OpenStruct对象工作。
嵌套on :include抛出错误,嵌套on :except不抛出错误,但没有过滤掉任何东西,:created_at等仍然显示。
...
@response = { :item => @article, :index => @index }
format.js { render :json => @response.to_json(
:except => {:item => [ :created_at, :updated_at, :draft, :id, :publish ]},
:include => { :item => {
:comments => {
:only => [:body]
}
}}),
:callback => params[:callback]}
end
发布于 2009-03-03 20:22:24
您应该能够像这样嵌套:include
、:except
等:
:except => {:item => [ :created_at, :updated_at, :draft, :id, :publish ]}...
如果这不起作用,那就把它变成一个对象(例如OpenStruct),而不是哈希。
-- Markus
https://stackoverflow.com/questions/607873
复制相似问题