Ruby on rails Rails,从类名获取类?

Ruby on rails Rails,从类名获取类?,ruby-on-rails,Ruby On Rails,我这里有一个问题,我试图调用一个未知对象上的类方法。。。呃,我不知道该如何表达我从URL获取的:资源,但我也想为不同的参数在其上运行find 我怎样才能做到: params[:resource].classify.find(params[:id]) /things/my-thing-name/vote/up @thing = Thing.find_by_friendly_id(params[:friendly_id]) 我的意思是这不起作用,因为params[:resource].clas

我这里有一个问题,我试图调用一个未知对象上的类方法。。。呃,我不知道该如何表达我从URL获取的:资源,但我也想为不同的参数在其上运行find

我怎样才能做到:

params[:resource].classify.find(params[:id])
/things/my-thing-name/vote/up
@thing = Thing.find_by_friendly_id(params[:friendly_id])
我的意思是这不起作用,因为params[:resource].classify将是一个字符串。但是,我如何在它上面运行一个方法,就好像它是一个类而不是一个字符串一样

下面的代码可以正常工作,但是gem-friendly\u-id已经对一个记录进行了所有调用,以返回它的friendly\u-id,而不是它的实际主键。。。这太糟糕了

它是这样做的,效果很好:

@vote = Vote.new({
  :vote => params[:direction] == 'up' ? true : false,
  :voteable_type => params[:resource].classify,
  :voteable_id => params[:id])
})
但由于添加了友好id,我的路径现在看起来像:

params[:resource].classify.find(params[:id])
/things/my-thing-name/vote/up
@thing = Thing.find_by_friendly_id(params[:friendly_id])
而不是老办法:

/things/328/vote/up
因此,现在params[:id]不再是外键


想法?

第一件事是参数[:资源]。分类你需要做的事情

params[:resource].constantize
对于第二种情况,您应该执行以下操作:

params[:resource].classify.find(params[:id])
/things/my-thing-name/vote/up
@thing = Thing.find_by_friendly_id(params[:friendly_id])

首先,params[:resource]。需要进行分类

params[:resource].constantize
对于第二种情况,您应该执行以下操作:

params[:resource].classify.find(params[:id])
/things/my-thing-name/vote/up
@thing = Thing.find_by_friendly_id(params[:friendly_id])

我被你的问题弄糊涂了,好像是2

对于第1部分,您可以将其恒定化。params[:resource].classify.constantize应返回类名,然后您可以在该类名上调用方法。为了安全起见,你可能想在固定化之前将其固定化,只是为了确保像-这样的事情将会发生。我之所以提到这一点,是因为你的友好身份证是如何建立的


至于第2部分,我不知道friendly_id gem,但根据它在中的工作原理的描述,除非我遗漏了什么,否则您的发现应该仍然可以正常工作

你的问题让我有点困惑,好像是2

对于第1部分,您可以将其恒定化。params[:resource].classify.constantize应返回类名,然后您可以在该类名上调用方法。为了安全起见,你可能想在固定化之前将其固定化,只是为了确保像-这样的事情将会发生。我之所以提到这一点,是因为你的友好身份证是如何建立的

至于第2部分,我不知道friendly_id gem,但根据它在中的工作原理的描述,除非我遗漏了什么,否则您的发现应该仍然可以正常工作

如果他的params[:resource]返回内容,他仍然应该分类,否则constantize很有可能因错误的常量名称错误而跳转。如果他的params[:resource]返回内容,他仍然应该分类,否则constantize很有可能因错误的常量名称错误而跳转。