如何确定已从ApplicationController调用了哪个控制器?

时间:2019-07-03 18:54:57

标签: ruby-on-rails ruby ruby-on-rails-5

我想在ApplicationController中放入一个方法,并仅在调用某些控制器的情况下启动它。类似于设计参数消毒剂:

before_action :configure_permitted_parameters, if: :devise_controller?

我尝试过:

before_action :recent_discussions, if: :first_controller? || :second_controller? || :third_controller?

但是first_controller?等是未定义的方法。

是否只有在特定控制器下才能在ApplicationController中调用某些内容?

4 个答案:

答案 0 :(得分:2)

假设您是在问题的伪代码中使用||而不是&&&&是没有道理的),那么它将起作用:

FANCY_CONTROLLERS = %w[FirstController SecondController ThirdController]
before_action :recent_discussions,
  if: proc { FANCY_CONTROLLERS.include? "#{controller_name.camelize}Controller" }

答案 1 :(得分:2)

将其放在您的应用程序控制器中

class ApplicationController < ActionController::Base
  # more code

  def special_controller?
    controller = params[:controller]
    special_controllers = %w(first second third)
    special_controllers.include? controller
  end
end

并将其放在您的特殊控制器中

class FirstController < ApplicationController
  before_action :recent_discussions, if: :special_controller?

  # more code
end

答案 2 :(得分:1)

您可以使用request.referrer来获取上一个动作的路径。

要让控制器负责该操作,请使用:Rails.application.routes.recognize_path(request.referrer)[:controller]

答案 3 :(得分:1)

您可以在def my_controller?; end中定义私有方法ApplicationController,并使用过滤器before_action :recent_discussions, if: :my_controller?

然后,在要实际运行此代码的控制器中,重新定义def my_controller?; true; end