我正在使用 Rails + jQuery-tokeninput 执行预输入搜索并填充“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 中,因此“未定义”显示在所选值中,搜索结果列表中不显示任何内容。javascript 控制台中还显示以下错误:
TypeError:“未定义”不是对象(评估“value.replace”)
任何帮助将不胜感激!