Rails,从类名获取Class?

时间:2010-09-20 21:57:16

标签: ruby-on-rails

我在这里有一个问题,我试图在一个未知的对象上调用类方法...错误,我不知道怎么说这个我从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]不再是外键了。

思想?

2 个答案:

答案 0 :(得分:3)

首先,你需要做“params [:resource] .classify”

params[:resource].constantize

对于第二个看起来你应该做的事情:

@thing = Thing.find_by_friendly_id(params[:friendly_id])

答案 1 :(得分:3)

我对你的问题感到有点困惑,好像是2。

对于第1部分,您可以constantizeparams[:resource].classify.constantize应该返回您可以调用方法的类名。为了安全起见,您可能希望在tableize之前constantize,以确保“ - ”之类的内容为“_”。我之所以提到这一点,只是因为你设置了friendly_id

至于第2部分,我不知道friendly_id宝石,但根据它在the guide中的工作方式的描述,你的发现应该仍然可以正常工作,除非我失踪一些东西。