我在这里有一个问题,我试图在一个未知的对象上调用类方法...错误,我不知道怎么说这个我从URL获取:资源,但是我想在它上面找一个不同的参数。
我该怎么做:
params[:resource].classify.find(params[:id])
我的意思是这不起作用,因为params[:resource].classify
将是一个字符串。但是我怎样才能在它上面运行一个方法,好像它是一个Class
而不是一个字符串?
以下过去工作正常,但是gem friendly_id
已经让我对记录的所有调用都返回它的friendly_id而不是它的实际主键......这完全很糟糕。
它正在做这样的事情,效果很好:
@vote = Vote.new({
:vote => params[:direction] == 'up' ? true : false,
:voteable_type => params[:resource].classify,
:voteable_id => params[:id])
})
但是,自从添加friendly_id
后,我的路径看起来像是:
/things/my-thing-name/vote/up
而不是旧方式:
/things/328/vote/up
所以现在params[:id]
不再是外键了。
思想?
答案 0 :(得分:3)
首先,你需要做“params [:resource] .classify”
params[:resource].constantize
对于第二个看起来你应该做的事情:
@thing = Thing.find_by_friendly_id(params[:friendly_id])
答案 1 :(得分:3)
我对你的问题感到有点困惑,好像是2。
对于第1部分,您可以constantize
。 params[:resource].classify.constantize
应该返回您可以调用方法的类名。为了安全起见,您可能希望在tableize
之前constantize
,以确保“ - ”之类的内容为“_”。我之所以提到这一点,只是因为你设置了friendly_id
。
至于第2部分,我不知道friendly_id
宝石,但根据它在the guide中的工作方式的描述,你的发现应该仍然可以正常工作,除非我失踪一些东西。