コントローラーフィルターオーバーライドヘルパーを作成するにはどうすればよいですか

paradox870

Railsではbefore_filter、コントローラーにを追加できます。ベースコントローラーが次のようになっていると仮定します。

before_filter :my_base_filter

これを前提として、この基本コントローラーから継承するコントローラーのホスト全体があり、この動作が正しいことが標準であると想定します。私は今、以下を行う少数のコントローラーを持っています:

skip_before_filter :my_base_filter, only: [:method1, :method2]
before_action only: [:method1, :method2] do
  my_secondary_filter(param1)
end

このコードは私のコントローラの数であり、かつ(だけでなく、かどうかそれが使用中で渡された方法ということを考えるonlyexcept)は、次の1つのコントローラと異なっている、私は理想的に希望の単一持っているbefore_actionbefore_filterということを私はそれが上記のコードを効果的に実行するだろうと呼ぶことができます。継承されたコントローラーでの呼び出しは、理想的には次のようになります。

replace_filter(param1, {only: [:method1, :method2]})

2番目のパラメーター(適用するメソッドの詳細を示すハッシュ)は、空の値を受け入れてすべてのメソッドに適用できる必要があります。私は(これらの他のフィルターと一緒に書かれている)ヘルパー関数を作成しましたが、構文的および論理的にこれを行う必要がありますが、before_actionまたはbefore_filter使用して、またはmy_base_filter最初に実行せずに正しく呼び出すことができないようですこれに似たようなことをすることは可能ですか?もしそうなら、そうするための最良の方法は何ですか?


application_controller.rb

class ApplicationController < ActionController::Base
  include ApplicationHelper

  before_action :my_base_filter
  ...
end

継承されたコントローラー.rb

class InheritedController < ApplicationController

  # I want to replace these lines with my new helper function
  skip_before_filter :my_base_filter, only: [:method1, :method2]
  before_action only: [:method1, :method2] do
    my_secondary_filter(param1)
  end
  ...
end

application_helper.rb

class ApplicationHelper

  def my_base_filter
    # Do shit here that is the normal behavior
  end

  def my_secondary_filter(param1)
    # Do shit here that is specific to certain functions INSTEAD
    # of running the normal base filter
  end

  # I want to be able to simply call this function
  # as a before_action or before_filter in order
  # to DRY up my code
  def replace_filter(param1, methods = {})
    # Run validation on parameters (including methods) here
    # including raising exceptions if necessary
    ...
    # Then run the following
    skip_before_filter :my_base_filter, methods
    before_action(methods) do
      my_secondary_filter(param1)
    end
  end
end
タリンイースト

だから... Railsには懸念と呼ばれるものがあります。これは、Railsでモジュールを引き出す方法でありながら、使用できる多数のneatoのものを許可することを目的としています。

それらが何であるか、そしてそれらをどのように使用するかについての記事がたくさんあります。探検させてあげましょう。

以下があなたの問題を解決するかどうかは確かではありませんが、それが私がそれに取り組む方法です。

問題の一部は、あなたが言うように、「replace_filter」メソッドを実行するまでに、bas_filterメソッドがすでに実行されていることです。

必要なのは、ApplicationHelperがコントローラーに初めて含まれるときにreplace_filterを実行できるようにすることです。

ここで、ActiveSupport::Concernincluded方法が役に立ちます。

このようなものを試してみてください:

# give this a meaningful name...
class FilterStuff < ActiveSupport::Concern

  included do
    puts "I'm in included"
    # note: not the replace_filter, but the method that will call it
    if defined?(:replace_filter_method)
       puts "This controller defines replace filter method which I'm now calling"
      replace_filter_method
    else
      puts "this controller does not define the replace method and will default to base behaviour"
      before_action :my_base_filter   
    end
  end

  def my_base_filter
    puts "I'm in my base filter"
  end

  def my_secondary_filter(param1)
    puts "I'm in secondary filter with param: #{param1}"
  end

  # making this work is another problem...
  def replace_filter(param1, methods = {})
    puts "I'm in replace filter with: #{param1} and #{methods.inspect}"

    # Run validation on parameters (including methods) here
    # including raising exceptions if necessary
    ...
    # Then run the following
    skip_before_filter :my_base_filter, methods
    before_action(methods) do
      my_secondary_filter(param1)
    end
  end
end
class InheritedController < ApplicationController
   include FilterStuff

   # actions go here...

   private

   # define this method only on controllers that need it
   def replace_filter_method
     puts "I'm in this controllers replace filter method"
     replace_filter(param1, only: [:method1, :method2])
   end
end

たくさんのprintfデバッグを追加しました-実行トラフがあり、いつ呼び出されているかがわかります-これは、適切なものを機能させるために何をする必要があるかを判断するのに役立ちます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Springでデフォルトのオーバーライド可能なコンポーネントを作成するにはどうすればよいですか?

分類Dev

Springでデフォルトのオーバーライド可能なコンポーネントを作成するにはどうすればよいですか?

分類Dev

Rails:DeviseコントローラーとDeviseルートを同時にオーバーライドするにはどうすればよいですか?

分類Dev

Vueコンポーネントのスコープスタイルをオーバーライドするにはどうすればよいですか?

分類Dev

グローバルタイプのコンテキスト変数をフラッターで作成するにはどうすればよいですか?

分類Dev

カラースクロールオーバーフローインジケーターを変更するにはどうすればよいですか?

分類Dev

複数のヘッダーファイルのインターフェイスからオーバーライドされた関数を宣言するときにコードの重複を回避するにはどうすればよいですか?

分類Dev

LightTableのデフォルトのキーバインディングをオーバーライドするにはどうすればよいですか?

分類Dev

モーダルオーバーフローを作成する代わりに、ブートストラップドロップダウンをモーダルフッター上に表示するにはどうすればよいですか?

分類Dev

ClangLLVMでコンパイルされたC ++コードのグラフィカルコードプロファイルレポートを作成するにはどうすればよいですか?

分類Dev

ブートストラップのフォームコントロールのポップオーバーで必須フィールドのデフォルトメッセージを変更するにはどうすればよいですか?

分類Dev

AngularでコンポーネントのCSSスタイルをオーバーライドするにはどうすればよいですか?

分類Dev

saltstackの.slsファイルを介して別のミニオンで実行されたターミナルコマンドでロードバランサーをターゲットにするにはどうすればよいですか?

分類Dev

コンストラクターパラメーターをインスタンスフィールドにバインドするにはどうすればよいですか?

分類Dev

ブラザーのオールインワンプリンター/スキャナー/ファックス用のプロプライエタリドライバーをインストールするにはどうすればよいですか?

分類Dev

IntelliJでKotlinの「このプロパティにはバッキングフィールドがあります」コードエディタのハイライトを変更するにはどうすればよいですか?

分類Dev

Swaggerコードジェネレーターによって作成されたモデルのスプリングレストコントローラーのフィールドを検証するにはどうすればよいですか?

分類Dev

コールバックパラメーターの非同期バージョンと同期バージョンの両方を受け入れるように関数をオーバーロードするにはどうすればよいですか

分類Dev

静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

分類Dev

ビューコントローラコードでテキストフィールド入力を取得するにはどうすればよいですか?

分類Dev

特定のコントロールのcssをオーバーライドするにはどうすればよいですか?

分類Dev

レンズでオーバーロードされたレコードフィールドを使用するにはどうすればよいですか?

分類Dev

NodeJSの文字列コンストラクターにグローバルプロパティを設定するにはどうすればよいですか?

分類Dev

オフラインサーバーにH2ORパッケージをインストールするにはどうすればよいですか?

分類Dev

ArangoDBクラスターをアクティブフェイルオーバーモードで起動するにはどうすればよいですか?

分類Dev

URLパラメータをVanillaJSの入力フィールドにバインドするにはどうすればよいですか?

分類Dev

Javascript-ユーザーがモバイル通知コントロールから再生/一時停止を押したときにデフォルトのアクションをオーバーライドするにはどうすればよいですか?

分類Dev

テンプレートからXSLTのグローバル変数をオーバーライドするにはどうすればよいですか?

分類Dev

Railsコントローラーのコールバックにパラメーターを渡すにはどうすればよいですか?

Related 関連記事

  1. 1

    Springでデフォルトのオーバーライド可能なコンポーネントを作成するにはどうすればよいですか?

  2. 2

    Springでデフォルトのオーバーライド可能なコンポーネントを作成するにはどうすればよいですか?

  3. 3

    Rails:DeviseコントローラーとDeviseルートを同時にオーバーライドするにはどうすればよいですか?

  4. 4

    Vueコンポーネントのスコープスタイルをオーバーライドするにはどうすればよいですか?

  5. 5

    グローバルタイプのコンテキスト変数をフラッターで作成するにはどうすればよいですか?

  6. 6

    カラースクロールオーバーフローインジケーターを変更するにはどうすればよいですか?

  7. 7

    複数のヘッダーファイルのインターフェイスからオーバーライドされた関数を宣言するときにコードの重複を回避するにはどうすればよいですか?

  8. 8

    LightTableのデフォルトのキーバインディングをオーバーライドするにはどうすればよいですか?

  9. 9

    モーダルオーバーフローを作成する代わりに、ブートストラップドロップダウンをモーダルフッター上に表示するにはどうすればよいですか?

  10. 10

    ClangLLVMでコンパイルされたC ++コードのグラフィカルコードプロファイルレポートを作成するにはどうすればよいですか?

  11. 11

    ブートストラップのフォームコントロールのポップオーバーで必須フィールドのデフォルトメッセージを変更するにはどうすればよいですか?

  12. 12

    AngularでコンポーネントのCSSスタイルをオーバーライドするにはどうすればよいですか?

  13. 13

    saltstackの.slsファイルを介して別のミニオンで実行されたターミナルコマンドでロードバランサーをターゲットにするにはどうすればよいですか?

  14. 14

    コンストラクターパラメーターをインスタンスフィールドにバインドするにはどうすればよいですか?

  15. 15

    ブラザーのオールインワンプリンター/スキャナー/ファックス用のプロプライエタリドライバーをインストールするにはどうすればよいですか?

  16. 16

    IntelliJでKotlinの「このプロパティにはバッキングフィールドがあります」コードエディタのハイライトを変更するにはどうすればよいですか?

  17. 17

    Swaggerコードジェネレーターによって作成されたモデルのスプリングレストコントローラーのフィールドを検証するにはどうすればよいですか?

  18. 18

    コールバックパラメーターの非同期バージョンと同期バージョンの両方を受け入れるように関数をオーバーロードするにはどうすればよいですか

  19. 19

    静的ファクトリーメソッドでオーバーライドされたメソッドでインスタンスを作成するときに、囲んでいるクラスのプライベートフィールドにアクセスするにはどうすればよいですか?

  20. 20

    ビューコントローラコードでテキストフィールド入力を取得するにはどうすればよいですか?

  21. 21

    特定のコントロールのcssをオーバーライドするにはどうすればよいですか?

  22. 22

    レンズでオーバーロードされたレコードフィールドを使用するにはどうすればよいですか?

  23. 23

    NodeJSの文字列コンストラクターにグローバルプロパティを設定するにはどうすればよいですか?

  24. 24

    オフラインサーバーにH2ORパッケージをインストールするにはどうすればよいですか?

  25. 25

    ArangoDBクラスターをアクティブフェイルオーバーモードで起動するにはどうすればよいですか?

  26. 26

    URLパラメータをVanillaJSの入力フィールドにバインドするにはどうすればよいですか?

  27. 27

    Javascript-ユーザーがモバイル通知コントロールから再生/一時停止を押したときにデフォルトのアクションをオーバーライドするにはどうすればよいですか?

  28. 28

    テンプレートからXSLTのグローバル変数をオーバーライドするにはどうすればよいですか?

  29. 29

    Railsコントローラーのコールバックにパラメーターを渡すにはどうすればよいですか?

ホットタグ

アーカイブ