我正在使用Rails + jQuery-tokeninput执行typeahead搜索并填充“belongs_to”关系。这里是模型:Rails + jQuery-tokeninput + Draper装饰器方法
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控制台:
类型错误:“未定义”不是一个对象(评估“value.replace”)
任何帮助将不胜感激!
谢谢!您的回答让我指出了正确的方向,但您的解决方案并不完全正确。正确的解决方案在这里:https://github.com/jcasimir/draper/issues/97 – mpelzsherman