我正在使用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