11

通話の使い方がよくわからないと思いますが、こんなことができると思いました。

@case_studies = CaseStudy.call("some_named_scope")

"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_scopenamed_scopeの場合、値に対応するメソッドを呼び出すために使用できます。しかし、これは明らかに非常に悪用可能です。CaseStudysendparams[: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_sendsendを使用します。これは、パブリックインターフェイスのメソッドの呼び出しでのみ機能し、sendプライベートメソッドにも到達できます。

それで:

CaseStudy.public_send(:some_scope)

于 2020-11-26T14:04:57.383 に答える