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'

控制器索引方法调用装饰器,如下所示:

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 中,因此“未定义”显示在所选值中,搜索结果列表中不显示任何内容。javascript 控制台中还显示以下错误:

TypeError:“未定义”不是对象(评估“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 回答