2012-09-16 28 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,但后来又是空的.. –