【问题标题】:How to load controller method from reqs string like "controller#action"如何从请求字符串加载控制器方法,如“controller#action”
【发布时间】:2018-07-10 16:27:09
【问题描述】:

我想从reqs字符串(路由项)加载create的实例方法,然后找到它的源位置 这就是你在路由文件中定义它的方式

get "route_name" => "controller#action"

通常,您可以使用以下语句来做到这一点

UsersController.instance_method(:create).source_location 甚至"UsersController".constantize.instance_method(:create)

我想知道是否有一种简单的方法可以做到这一点。 我知道我可以扩展斜杠并拆分散列以加载实例方法,但我确信有一种快速的方法,因为这在 Rails 路由中很常见

【问题讨论】:

    标签: ruby-on-rails rails-routing


    【解决方案1】:

    这行得通吗(您可以将 find_path 更改为您想要查找的任何路径)?

    find_path = '/'
    controller_name = Rails.application.routes.recognize_path(find_path)[:controller]
    controller_class = (controller_name + '_controller').classify.constantize
    controller_class.instance_method(:create).source_location
    

    我不知道你是否喜欢解析 routes.rb 文件。如果没有,您可以使用以下方法获取所有应用程序路由的列表:Method: ActionDispatch::Routing::RouteSet#named_routes

    如果我误解了,请告诉我。

    【讨论】:

    • 所以我之前做了所有这些。我使用 RouteInspector 获取路由并收到 reqs 参数。我想知道是否有一种方法可以直接解析 ruby​​ 中的字符串。我最终做到了execution_path = 'api/vi1/users_controller#create' controller,action = execution_path.split("#") controller = controller + "_controller" controller_class = controller.camelize.constantize source_code = controller_class.instance_method(action).source
    【解决方案2】:

    所以我最终使用了以下代码:

    execution_path= "api/v1/users_controller#action"
    controller,action = execution_path.split("#")
    controller = controller + "_controller"
    controller_class = controller.camelize.constantize
    source_code = controller_class.instance_method(action).source_location
    

    【讨论】:

      猜你喜欢
      • 2020-06-27
      • 2014-10-01
      • 2018-02-04
      • 1970-01-01
      • 2013-06-10
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多