将 rails 表格拆分为更小的表格

Split rails form into smaller forms

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

配置文件表单很长,包含 10 个以上的字段,我想要做的是创建一个带有 links 的边栏到配置文件模型的较小部分。

例如profile model采用perusal details,所以有一个link个人资料,当用户点击个人资料时,他可以输入个人资料,还有一个link地址和时间用户点击地址弹出地址表单。所有这些子表单基本上都会构建配置文件模型。

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

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

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

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

  # 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

在我的经理中,我总是return一个散列。如果操作成功,散列将包含 success: true。而且,我通常包含一个 body 元素,其中包含 (a) 控制器进行任何 post 处理或 (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 比测试控制器容易得多, 海事组织。
  3. 您可以使用管理器来管理交易 多个模型(可能使用实际交易块来 管理失败的模型交互)。
  4. 根据您的要求,您可以跨控制器使用管理器并保持方法来源的透明度。