【问题标题】: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】:
一种方法是为每个部分创建单独的控制器。因此,您可能有PersonalDetailsController、AddressesController 等。
然后,我的实践是创建一个普通的旧 Ruby 对象,我与控制器一致地命名它。所以,我会有一个PersonalDetailsManager、AddressesManager 等等。这些“经理”(有些人称他们为“服务”)可能看起来像这样:
# 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
我喜欢这种方法的一些地方:
- 它在我的视图、控制器和
楷模。
- 测试 PORO 比测试控制器容易得多,
国际海事组织。
- 您可以使用管理器来管理跨平台的事务
多个模型(可能使用实际的事务块来
管理失败的模型交互)。
- 根据您的要求,您可以跨控制器使用管理器并保持方法来源的透明度。