【问题标题】:How to add single method to handle multiple routes如何添加单个方法来处理多个路由
【发布时间】:2017-02-07 15:46:31
【问题描述】:

我的 Rails 应用程序是一些 REST API 服务的代理服务器 这意味着对 REST 服务器的所有请求都通过我的 Rails 应用程序进行路由。我已经在我的 routes.rb 文件中定义了所有需要的路由,并且我为我的控制器中的每个路由编写了不同的方法。因此,我希望控制器中有一个方法,而不是每个路由的不同方法,我可以在其中检查 request.fullpath 并根据请求参数将其重定向到适当的休息服务调用

这是我的路线的样子

  get '/lookup/location/search', to: 'ticketing#lookup_location_search'
  get '/lookup/company/search', to: 'ticketing#lookup_company_search'
  get '/lookup/assignmentGroup/search', to: 'ticketing#lookup_assignment_group_search'
  get '/lookup/ci/search', to: 'ticketing#lookup_ci_search'
  get '/lookup/user/search', to: 'ticketing#lookup_user_search'  

对于每条路由,控制器中存在一个单独的方法,而不是我想要一个方法,该方法将根据请求参数进一步调用正确的 rest URL

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 routes ruby-on-rails-3.2


    【解决方案1】:

    我认为您可以像这样使用通配符路由来解决您的问题:

    # routes.rb
    get '/lookup/*other_parts', to: 'ticketing#proxy_action' , format: false
    # maybe with constraints
    # get '/lookup/*other_parts', to: 'ticketing#proxy_action' , format: false,  constraints: { other_parts: /.../ }  
    
    # within your controller
    def proxy_action
      case params[:other_parts] 
        when 'location/search'
            ...
        when 'assignmentGroup/search'
           ...
        ...
        else
          ...
      end
    

    【讨论】:

    • @adrian 是的,你的权利。我的意思是案例。我确实更正了我的代码。
    • 那么当你在switch语句中匹配另一部分时,那么如何匹配动态数据呢?例如-'location/:location_id/search'
    • @Sunny 你能详细解释一下吗?你没有在你的问题中提到这一点。我不知道我是否正确。您仍然可以添加更多路线,例如get '/location/:location_id/*other_parts', to: 'ticketing#proxy_action' , format: false 您只需要确保最后出现最一般的规则即可。
    • 所以在我的路由中,我保留了通用路由以将其重定向到单个控制器操作,例如 match '/ticketingService/*other_parts' => 'ticketing#proxy_action',通过:[:get,:put, :post] 在使用基于匹配路由的 switch case 的控制器中,我正在渲染一些模拟 json,但现在如果路由有一些动态数据,我将面临问题。如何在我的开关盒中匹配以下路线,因为它包含 location_id 并且它是动态的 '/location/:location_id/*other_parts'
    • 当两条路线差异很大时,我不会用一个动作来处理它。我会使用 2 个动作并将通用逻辑提取到 private 方法中。这大大简化了case 语句,并且在我看来将更加面向对象。无论如何,如果您想在一个操作中执行此操作,您可以先检查params[:location_id] 是否存在并处理所需的特殊逻辑,然后再继续执行case 语句。
    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多