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'
コントローラーの index メソッドは、次のようにデコレーターを呼び出します。
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
デコレータを使用していない場合、これはすべて正常に機能しているように見えますが、デコレータを追加すると問題が発生します。コントローラーが生成するjsonに「full_title」属性が含まれていないため、選択値に「undefined」と表示され、検索結果一覧に何も表示されません。次のエラーは、javascript コンソールにも表示されます。
TypeError: 'undefined' はオブジェクトではありません ('value.replace' を評価しています)
どんな助けでも大歓迎です!