【问题标题】:Rails 5.2 Service objects with non current userRails 5.2 非当前用户的服务对象
【发布时间】:2019-06-18 02:12:24
【问题描述】:

我正在尝试通过 rails 5.2 中的服务对象方法将操作转发给另一个控制器。

创建操作应传递创建操作的用户 ID,但我未能正确传递该参数。

业务逻辑如下:用户出租资产,潜在承租人提出请求,当资产所有者同意访问时,在另一个控制器中创建出租用户作为客户端组织访问。

我正在尝试按如下方式解决客户端控制器中的创建操作:

在租金控制器中:

private

 def visit(room, rent)
   @newclient = NewclientService.create(params)
   if @newclient.save
   rent.Approved!
   ...
  else
  rent.Declined!
  ...
end

然后在 app/service/newclient_service.rb 中

module NewclientService
  class << self
    def create(params)
      @rent = Rent.find_by(id: params[:id])
      user = @rent.user_id
      name = @rent.user.fullname
      email = @rent.user.email
      Client.create(user_id: user, name: name, email: email)
    end
  end
end

这段代码完成了这项工作。数据库已满,验证和强大的参数似乎有效,在我看来它足够强大/安全。

问题:服务对象(我的方式?)路由是转发该操作的最首选方式吗?

感谢您的帮助,

【问题讨论】:

    标签: ruby-on-rails service-object


    【解决方案1】:

    原则上我喜欢这种模式,它确实清理了我制作的应用程序。我通常使用一些不错的 gem 来完成工作并保持控制器清洁。

    我使用mutations gem 和simple_command。这两者一起为您提供了一个很好的(几乎完全)一致的 API。 mutations gem 尤其是我用来消化和解析来自参数的 JSON 输入数据,然后可以为我处理进程。

    这是一个很好的模式,因为它很好地封装了离散功能的逻辑。例如,如果您有一个 RegisterUser 突变,您可以在控制器中使用它,或者您可以使用它来消化整个对象列表等。您甚至可以使用属性的 builder 选项来处理深度嵌套的 json。

    我建议你去看看。

    https://github.com/cypriss/mutations

    当我不处理来自 API 的 JSON 并且想要创建离散的封装功能时,我通常使用 simple_commandhttps://github.com/nebulab/simple_command。这种方法也很棒,因为它允许您在任何上下文中使用相同的组件。例如,一个名为 GetLatestTweets.call() 的命令在控制器中的使用效果与在 REPL 中的使用效果一样好。

    这两个库都为您提供了一个结果对象,您可以根据需要对其进行处理

    def create
      outcome = NewClientMutation.run(params.require(:resource).permit!)
      if outcome.success?
         render json: outcome.result, status: :created
      else
         render json: {resource: outcome.result, errors: outcome.errors}, status: :unprocessable_entity 
      end
    end
    

    在我的特殊情况下,我使用“许可!”因为突变库会忽略任何未明确指定的参数,这意味着如果您使用此库,则不需要强参数,因为它也会过滤参数。

    【讨论】:

    • 感谢您的全面回答。在 stack over flow 中发现的社区支持非常宝贵。我需要消化,但在逻辑方面,据我了解:突变最好用于支持基于 Rails 的 API 的 json 前端;整个 simple_command 是一个有助于/系统化构建服务对象的 gem。
    • 听起来不错。如果您想联系我,我很乐意进一步扩展。
    猜你喜欢
    • 2011-05-08
    • 2013-10-18
    • 2015-09-12
    • 2023-03-30
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多