【问题标题】:Filter json render in Rails在 Rails 中过滤 json 渲染
【发布时间】:2011-03-22 17:47:19
【问题描述】:

如果我只想返回 JSON 中的 :id 和 :name 字段,最好的方法是什么

到目前为止我有:

format.json { render :json => @contacts.map(&:attributes) , :only => ["id"]}

但是 "name" 属性在 :only 部分中不起作用,因为它不是数据库中的列(它在模型中定义为 firstname + lastname)

谢谢!

【问题讨论】:

    标签: ruby-on-rails json ruby-on-rails-3


    【解决方案1】:

    Rails 3 支持以下过滤器选项。就这么简单

    respond_to do |format|
      format.json { render json: @contacts, :only => [:id, :name] }
    end  
    

    【讨论】:

    • 实际上,因为名称是一种方法,我相信它会渲染 json:@contacts,仅:[:id],方法:[:name]
    【解决方案2】:

    您可以将:methods 传递给 to_json / as_json

    format.json do
      render :json => @contacts.map { |contact| contact.as_json(:only => :id, :methods => :name) }
    end
    

    或者你可以手动建立一个哈希

    format.json do
      render :json => @contacts.map { |contact| {:id => contact.id, :name => contact.name} }
    end
    

    见:http://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html#method-i-as_json

    【讨论】:

    • 我们同时更新了我们的评论。现在我得到: [{"contact":{"name":"Executor From_wizard","id":null}}] 但我需要 [{"name":"Executor From_wizard","id":"1"} ]
    • 尝试先设置这个ActiveModel::Base.include_root_in_json = false
    • 无法在某处使用 .map(&:attributes) 来仅显示属性?不确定我想更改默认行为。谢谢!
    • ok 找到了一种可行的方法:render :json => @contacts.map { |contact| {:id => contact.id, :name => contact.name} } 感谢您的帮助。请使用此信息编辑您的答案,我会将其设置为好答案。
    猜你喜欢
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多