输出格式化json与rails 3

时间:2010-12-05 22:35:46

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

我使用rails 3.0.3

javascript自动完成需要这样的数据

{
 query:'Li',
 suggestions:['Liberia','Libyan Arab Jamahiriya','Liechtenstein','Lithuania'],
 data:['LR','LY','LI','LT']
}

我的行动是

  def autocomplete
    @query = params[:query]
    @customers = Customer.where('firstname like ?', "%#{@query}%")
    render :partial => "customers/autocomplete.json"
  end

我的观点是

{
    query:'<%= @query %>',
    suggestions: <%= raw @customers.map{|c| "#{c.firstname} #{c.lastname}" } %>,
    data: <%= raw @customers.to_json %>
}

它返回

{
    query:'e',
    suggestions: ["customer 1", "customer 2"],
    data: [1, 3]
}

它不起作用,因为建议/数据的数据应该在简单引用之间......

我不能使用to_json方法,因为它会返回我对象的所有内容。

有什么建议吗?

欢呼声

3 个答案:

答案 0 :(得分:10)

注意:这已经过时了,Jbuilder是更好的选择。


有两种方法可以解决这个问题。如果您只需要对象中的字段子集,则可以使用:only:except排除您不想要的内容。

@customer.to_json(:only => [:id, :name])

在您的示例中,您似乎需要以特定格式返回json,因此只是序列化一组结果将无法正常工作。创建自定义json响应的最简单方法是使用Hash对象:

render :json => {
  :query => 'e',
  :suggestions => @customers.collect(&:name),
  :data => @customers.collect(&:id)
}

我尝试使用partials来构建json响应,但这并不像使用Hash那样有效。


将名字和姓氏格式化为单个字符串是您可能在视图中做很多事情的,我建议将其移到函数中:

class Customer < ActiveRecord::Base
  ...
  def name
    "#{first_name} #{last_name}"
  end

  def name=(n)
    first_name, last_name = n.split(' ', 2)
  end
end

只是一些便利功能,让您的生活更轻松,您的控制器/视图更清洁。

答案 1 :(得分:1)

如果亚当的回答不适合你,可能会这样做(诚然不是最优雅的解决方案):

{
    query:'<%= @query %>',
    suggestions: [<%= raw @customers.map{|c| "'#{c.firstname} #{c.lastname}'" }.join(", ") %>],
    data: [<%= raw @customers.map{|c| "'#{c.id}'" }.join(", ") %>]
}

答案 2 :(得分:1)

我在.erb中看到过类似的东西:

<%= raw
  {
    :query       => @query,
    :suggestions => @customers.map{|c| "#{c.firstname} #{c.lastname}" },
    :data        => @customers
  }.to_json
%>

如果考虑准备将其他程序作为表示逻辑使用的数据,这可能对您有意义。

FWIW我喜欢它。