0

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' を評価しています)

どんな助けでも大歓迎です!

4

1 に答える 1

1

問題は、 to_json がオブジェクトのメソッドを認識していないため、 :methods パラメータを介して明示的に伝える必要があることです。以前に Draper を使用したことはありませんが、CompositionDecorator に独自のカスタム to_json を追加できるようです。したがって、次のようなものが機能する可能性があります。

class CompositionDecorator

  def to_json
    composition.to_json(:methods => [:full_title])
  end

end

以下も参照してください。

于 2012-05-21T02:37:34.783 に答える