【问题标题】:Split rails form into smaller forms分裂的铁轨形成更小的形式
【发布时间】:2016-03-15 14:16:47
【问题描述】:

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

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

例如profile模型需要阅读详细信息,所以有一个个人详细信息的链接,当用户点击个人详细信息时,他可以输入个人详细信息,还有一个地址链接,当用户点击地址时会弹出地址表单。所有这些子表单本质上都会构建配置文件模型。

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

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

【问题讨论】:

  • 总体上听起来是个好主意。您有具体问题吗?
  • 我的问题是你会怎么做?

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


【解决方案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 比测试控制器容易得多, 国际海事组织。
  3. 您可以使用管理器来管理跨平台的事务 多个模型(可能使用实际的事务块来 管理失败的模型交互)。
  4. 根据您的要求,您可以跨控制器使用管理器并保持方法来源的透明度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多