我使用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方法,因为它会返回我对象的所有内容。
有什么建议吗?
欢呼声
答案 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我喜欢它。