2012-05-21 40 views
0

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

任何幫助將不勝感激!

回答

1

問題是to_json不知道對象上的方法,所以你必須通過:methods參數明確地告訴它。我之前沒有使用過Draper,但看起來可以在您的CompositionDecorator中添加自己的自定義to_json。所以,這樣的事情可能工作:

class CompositionDecorator 

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

end 

參見:

+0

謝謝!您的回答讓我指出了正確的方向,但您的解決方案並不完全正確。正確的解決方案在這裏:https://github.com/jcasimir/draper/issues/97 – mpelzsherman