用轨道3输出格式化的json

我使用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:'', suggestions: , data:  } 

它返回

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

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

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

有什么建议吗?

干杯

注意 :这已经过时了, 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 

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

如果亚当的回答对您不起作用,可能会这样做(诚然不是最优雅的解决方案):

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

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

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

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

FWIW我喜欢它。