2012-02-27 34 views
10

假设我想制作一个页面,可以使用类型(字符串)和id(int)查询所需的对象。使用字符串输入引用模型

/查询?类型=人& ID = 1

会接我

Person.find的(1)

/阙RY?类型=城市& ID = 123

会接我

City.find(123)

不过,我的问题是如何转换字符串到所需模型类。

我能想到的唯一的办法就是

case params[:type] 
when 'people' 
    @object = Person.find(params[:id]) 
when 'cities' 
    @object = City.find(params[:id]) 
end 

然而,这种方法会很成问题,如果我有更多类型的模型。

有没有更好的方法?

谢谢你在前进,

+3

如果尝试自动执行此操作,您可以在情况最终在那里攻击者可以发送“/query?type = TOP_SECRET_TABLE&id = 1“,并获取他不应该被允许访问的信息。谨防你想要的东西。 – Sebi 2012-02-27 09:44:21

+0

它实际上是用于标记对象的ajax。所以我的下一步就像@ object.tags << tag。但想要保持这个问题很简单,所以这样问。不管怎么说,多谢拉! – rickypai 2012-02-27 09:56:50

回答

37

尝试:

klass = params[:type] 
klass.singularize.classify.constantize.find(params[:id]) 

编辑:

@object = params[:type].singularize.classify.constantize.find(params[:id]) 
+0

你的代码并不能直接使用,但是我编辑过了,现在它可以工作了!非常感谢! – rickypai 2012-02-27 09:53:22

+0

是的,一个错字'类型'到'klass',谢谢。 – 2012-02-27 09:59:24