11

我确定我错过了对 call 的使用的理解,但我认为我可以做这样的事情。

@case_studies = CaseStudy.call("some_named_scope")

Where"some_named_scope"也是CaseStudy. 我需要使用 call 的原因是因为我已经命名了与控制器中的操作名称相同的范围,所以我想做这样的事情。

@case_studies = CaseStudy.call(params[:action])

编辑

原谅我,我才意识到我在考虑 send 方法,一些 call 这个词是怎么卡在我脑海里的。但@case_studies = CaseStudy.send(params[:action])按我想的那样工作。

4

4 回答 4

9

如果some_named_scope是model的named_scopeCaseStudy可以send用来调用value对应的方法params[:action]。但这显然是可大量利用的。

因此,除了安全性,您可以使用:

@case_studies = CaseStudy.send(params[:action])

希望它有效。

于 2012-11-09T22:44:26.097 回答
8

尽管@kolrie 有正确的答案,但它根本不安全。

它应该被列入白名单,如下所示:

scope = ["first_scope", "second_scope", "default_scope"].include? params[:action] ? params[:scope] : "default_scope"
@case_studies = CaseStudy.send(scope)
于 2015-08-21T13:29:14.653 回答
0

如果我明白你的意思,那就是你应该这样称呼它:

@case_studies = CaseStudy.send(:some_named_scope)

您可以使用 send 调用方法并将符号或字符串传递给它。

于 2012-11-09T22:42:07.513 回答
0

要在 BookOfGreg 建议的白名单之上增加一层安全性,请使用public_send而不是send,它只能调用公共接口的方法,而send甚至可以访问私有方法。

所以:

CaseStudy.public_send(:some_scope)

于 2020-11-26T14:04:57.383 回答