2012-05-21 34 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