加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 为轨道中的所有Web服务调用创建一个包装器控制

发布时间:2020-12-16 21:48:00 所属栏目:百科 来源:网络整理
导读:我正在为现有的应用程序控制器创建一个包装器. 例如,我有两个控制器接受类似的参数和类似的方法. 代码如下 class EmployeeController ApplicationController def list endendclass DepartmentController ApplicationController def list endend 终点将是http
我正在为现有的应用程序控制器创建一个包装器.

例如,我有两个控制器接受类似的参数和类似的方法.

代码如下

class EmployeeController < ApplicationController

  def list
  end

end


class DepartmentController < ApplicationController

  def list
  end

end

终点将是http://localhost:3000/employee/list
&安培;
http://localhost:3000/department/list

创建包装控制器并调用任一控制器动作的最佳方式是什么?

这是正确的,我们检查某些参数并相应地创建对象,或者有更好的方法来做到这一点

class WrapperController < ApplicationController


  def list
    if params["which"].eql?("employee")
      data = EmployeeController.new(params).create
    else
      data = DepartmentController.new(params).label
    end

  end
end

终点将是http://localhost:3000/wrapper/list

任何帮助将不胜感激.提前致谢.

解决方法

这个WrapperController听起来真是个坏主意.特别是实例化另一个控制器并调用它的方法.我不记得在任何地方看到这样的模式. Rails在请求/响应周期周围有很多魔法,所以调用另一个控制器很可能会在以后打破某些事情.我只是猜测cookie可能不工作,或者渲染可以被打破等等

无论如何,您可能想要更好地在Rails应用程序中组织您的业务逻辑.作为起点,我强烈建议您阅读this article.根据您的问题的有限信息,很难给您一个很好的答案为您的具体情况.

例如,您可以实现一个查询对象:

class EmployeesQuery
  def initialize(params)
    # initialize some internal variables
  end

  def list
    # write code for fetching employees based on passed params
  end
end

class DepartmentsQuery
  def initialize(params)
    # initialize some internal variables
  end

  def list
    # write code for fetching employees based on passed params
  end
end

class QueryFactory
  QUERIES = {
    "employee" => EmployeeQuery,"department" => DepartmentQuery
  }

  get self.get_query(resource)
    QUERIES[resource] || raise("Some exception")
  end
end

现在你可以创建一个ListsController:

class ListsController < ApplicationController
  def index
    data = QueryFactory.get_query(params[:which]).list
    # render specific view based on requested resource
    # and rescue possible exception from get_query method
  end
end

并在config / routes.rb中:

get "/:which/list" => "lists#index"

这可以稍后用更多的资源进行扩展,并且具有单独的查询对象,每个将使其更易于维护.唯一有问题的是如何渲染生成的结果,但您可以使用相似的模式来选择正确的模板来呈现.

如果要创建类似的对象模式,应该查看服务对象模式.它在链接的文章中描述.

你也可以用简单的方式解决你的问题,只需要改变一下config / routes.rb.

get "/:controller/list",to: :list

它将路由/员工/列表到EmployeeController和/ department / list到DepartmentController.并且基本上它将路由到任何有效的控制器,所以也许你想调整一点,并添加一些限制.

希望有帮助.干杯.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读