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

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 に答える
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 に答える