微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – 用轨道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:'<%= @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方法,因为它将返回我的对象​​的所有内容.

有什么建议吗?

干杯

解决方法

注意:这是过时的,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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐