我使用Rails + jQuery-tokeninput来执行typeahead搜索并填充"belongs_to“关系。以下是模型:
class Performance < ActiveRecord::Base
attr_accessible :composition_tokens
belongs_to :composition
...
attr_reader :composition_tokens
def composition_tokens=(ids) # comma-separated
self.composition_tokens = ids.split(',')
end
end我们在这个项目中使用Draper为我们的模型提供装饰器。
我们的CompositionDecorator有以下方法:
class CompositionDecorator < ApplicationDecorator
decorates :composition
def full_title
model.title + ' by ' + model.composer.canonical_name
end我已经设置了tokeninput支持来使用装饰器,如下所示:
jQuery ->
$('#performance_composition_tokens').tokenInput '/admin/compositions.json'
theme: 'facebook'
prePopulate:$('#performance_composition_tokens').data('load')
propertyToSearch: 'full_title'控制器索引方法像这样调用装饰器:
class Admin::CompositionsController < Admin::BaseController
def index
@compositions = Composition.includes(:composer).paginate(:page => params[:page]||1)
respond_to do |format|
format.html
format.json { render :json =>
CompositionDecorator.decorate(@compositions.where("title like ?",
"%#{params[:q]}%")) }
end
end当我不使用装饰器时,这一切似乎都工作得很好,但添加装饰器会导致问题。"full_title“属性没有包含在控制器生成的json中,因此"undefined”显示在所选值中,并且搜索结果列表中不显示任何内容。javascript控制台中还显示以下错误:
TypeError:“undefined”不是对象(对“value.replace”求值)
任何帮助都将不胜感激!
发布于 2012-05-21 10:37:35
问题是to_json不知道对象上的方法,所以您必须通过:methods参数显式地告诉它。我以前没有使用过Draper,但是看起来你可以在你的CompositionDecorator中添加你自己的自定义to_json。所以,像这样的东西可能会起作用:
class CompositionDecorator
def to_json
composition.to_json(:methods => [:full_title])
end
end另请参阅:
https://stackoverflow.com/questions/10678874
复制相似问题