分离轨道形成较小的形式

时间:2016-03-15 14:16:47

标签: ruby-on-rails ruby ruby-on-rails-4 rubygems

我使用设计和配置文件模型设置了用户模型。用户has_one个人资料和个人资料属于用户。

配置文件表单占用10多个字段非常长,我要做的是创建一个侧栏,其中包含指向配置文件模型较小部分的链接。

例如,个人资料模型需要详细信息,因此有个人详细信息的链接,当用户点击个人详细信息时,他可以输入个人详细信息,以及地址链接,当用户点击地址弹出地址表单时。所有这些子表单基本上都构建了配置文件模型。

在创建用户时,配置文件与用户一起构建并相应连接。

完成这项工作的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

一种方法是为每个部分创建单独的控制器。因此,您可能拥有PersonalDetailsControllerAddressesController等等。

然后,我的做法是创建一个与控制器一致的普通旧Ruby对象。所以,我会有PersonalDetailsManagerAddressesManager等等。这些“经理”(有些人称之为“服务”)可能看起来像这样:

  # app/managers/personal_details_manager.rb
  class PersonalDetailsManager
    class << self
      def create_details(params)
        ... logic to create new personal details
      end

      def update_details(params)
        ... logic to update personal details
      end
    end
  end

在我的经理中,我总是返回哈希。如果操作成功,则哈希将包含success: true。而且,我通常包含一个body元素,其中包含(a)控制器进行任何后期处理所需的任何信息,或者(b)视图可能需要渲染的信息。我经常包含一个errors元素,以防我想用它来反馈给用户。

请注意,我将经理放在他们自己的文件夹中。然后,在我的控制器中,我可能会做类似的事情:

  PersonalDetailsController < ApplicationController
    def create
      @results = PersonalDetailsManager.create_details(params)
      if @results[:success]
        ... do success routing and/or post processing
      else
        ... do failure routing and/or post processing
      end
    end
  end

我喜欢这种方法的一些事情:

  1. 它在我的视图,控制器和。之间创建了非常松散的耦合 楷模。
  2. 测试PORO比测试控制器更容易, IMO。
  3. 您可以使用经理来管理跨越的交易 多个模型(使用,可能是实际的事务块) 管理失败的模型交互)。
  4. 根据您的要求,您可以跨控制器使用管理器,并保持方法来源的透明度。