Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使用字符串调用名为scope的活动记录_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 如何使用字符串调用名为scope的活动记录

Ruby on rails 如何使用字符串调用名为scope的活动记录,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我肯定我不理解call的用法,但我想我可以做这样的事情 @case_studies = CaseStudy.call("some_named_scope") @case_studies = CaseStudy.call(params[:action]) 其中,“某些命名范围”也是案例研究中的命名范围。我之所以需要使用call,是因为我已经命名了与控制器中的操作名称相同的作用域,所以我开始这样做 @case_studies = CaseStudy.call("some_named_scope"

我肯定我不理解call的用法,但我想我可以做这样的事情

@case_studies = CaseStudy.call("some_named_scope")
@case_studies = CaseStudy.call(params[:action])
其中,
“某些命名范围”
也是案例研究中的命名范围。我之所以需要使用call,是因为我已经命名了与控制器中的操作名称相同的作用域,所以我开始这样做

@case_studies = CaseStudy.call("some_named_scope")
@case_studies = CaseStudy.call(params[:action])
编辑


原谅我,我刚刚意识到我在考虑send方法,call这个词是如何在我脑海中出现的。但是
@case\u studies=CaseStudy.send(params[:action])
就像我想的那样工作。

如果我理解你的意思,那就是你应该称之为:

@case_studies = CaseStudy.send(:some_named_scope)

您可以使用send调用方法并向其传递符号或字符串。

如果
某个命名范围
案例研究
模型的命名范围,您可以使用
send
调用与
参数[:action]
值对应的方法。但这显然是可以大量利用的

所以,撇开安全不谈,你可以开始:

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

希望它能起作用。

尽管@korlie有正确的答案,但它一点也不安全

应将其列入白名单,如下所示:

scope = ["first_scope", "second_scope", "default_scope"].include? params[:action] ? params[:scope] : "default_scope"
@case_studies = CaseStudy.send(scope)

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

因此:


案例研究。公共发送(:某些范围)

我对你的答案投了高票,因为你先回答了。我有时间真正理解他在问什么我很感激,是的,这是一个令人困惑的问题。让我理解的是术语“命名范围”:-)当你说这显然是严重可利用的时,你能告诉我一个更好的方法来做这样的事情吗?我想到的是,你至少可以执行一个检查,确保
参数[:action]
在一些预期值内。类似于
if%w(已批准的挂起的未分配)。包括?(参数[:操作]。。。;end
@DigitalCake从params(即用户或机器人)中提取此字符串意味着他们可以在其中放入他们想要的任何内容。最好的办法是将你的期望值列在白名单上,这样就不会有任何异常情况发生:我尝试了一下,但我可能遗漏了一些东西CaseStudy.const_get(“work”),name错误:错误的常量名称work作为CaseStudy.work是有效的作用域。