2012-09-16 29 views
0

在我的控制,我有:的Rails如何選擇屬性

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和標題。我如何選擇這個?

+0

您使用的每個時,你應該使用的地圖(和在模型中執行此操作時,請在控制器中執行此操作) – tokland

回答

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

+0

如果您必須爲此呈現多個JSON數據相同的模型,但具有其他屬性什麼是最好的解決方案? –

+0

然後我只使用唯一的選擇:) –

+0

這是一個很好的問題。據我所知,這不是最好的方式,因爲它取決於你想要導出JSON的內容。您可以在模型類中編寫多個導出JSON方法。或者用switch..case語句自定義as_json。然後,只需更改傳遞給to_json或as_json方法的參數。更多的想法? –

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 
+0

白名單如何工作? –

+0

剛剛用你的代碼替換了代碼,現在json數據只是空的:[{}] –

+0

我還將白名單添加到我的模型中。剛剛添加kat.whitelist,但後來又是空的.. –