Rails如何选择属性

时间:2012-09-16 17:12:44

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.1

在我的控制器中我有:

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和标题。我该如何选择?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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