0

我正在尝试通过 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

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

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

谢谢你的帮助,

4

1 回答 1

0

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

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

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

我建议检查一下。

https://github.com/cypriss/mutations

对于那些我不从 API 处理 JSON 并且想要创建离散封装功能的时候,我通常使用simple_command https://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

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

于 2019-01-24T11:43:32.460 回答