0

在我的控制器中,我有:

def search
  @kategoris = Kampagner.where("titel like ?", "%#{params[:q]}%")
  @kate = []
  @kategoris.each do |kat|
    h = {}
    kat.attributes.each{|k,v| h[k] = v.respond_to?(:force_encoding) ? v.dup.force_encoding("UTF-8") : v }
    @kate << h
  end
  respond_to do |format|
  format.html
  format.json { render :json => @kate }
  end
end

但问题在于模型的所有属性都在 JSON 数据中。我只有 JSON 数据中的属性 ID 和标题。我该如何选择这个?

4

2 回答 2

2

我会做:

@kategoris.each do |kat|
  @kate << kat.sanitized_whitelist
end

在模型中:

WHITE_LIST_ATTRS = [:id, :title]

def whitelist
  WHITE_LIST_ATTRS.each_with_object({}) {|attr, hash| hash[attr] = send(attr) }
end

或考虑一些专用方法:

def sanitized_whitelist 
  WHITE_LIST_ATTRS.each_with_object({}) {|attr,hash| hash[attr] = send(attr).respond_to?(:force_encoding) ? send(attr).dup.force_encoding("UTF-8") : send(attr) }
end
于 2012-09-16T17:15:25.563 回答
2

我不太清楚你为什么要使用 force_encoding。但是您可以简单地调用:

format.json { render :json => @kategoris }

Rails 会在后台调用 as_json 方法。然后在 Kampagner 类中,您可以自定义 as_json 类来控制将记录导出为 JSON 时将公开的内容:

class Kampagner
  def as_json(options={})
    super(options.merge({ :only => [:id, :title]})
  end
end

查看更多:http ://api.rubyonrails.org/classes/ActiveModel/Serializers/JSON.html

于 2012-09-16T17:24:44.407 回答