将 rails 表格拆分为更小的表格
Split rails form into smaller forms
我有一个使用设计和配置文件模型设置的用户模型。用户 has_one 个人资料和个人资料属于一个用户。
配置文件表单很长,包含 10 个以上的字段,我想要做的是创建一个带有 links 的边栏到配置文件模型的较小部分。
例如profile model采用perusal details,所以有一个link个人资料,当用户点击个人资料时,他可以输入个人资料,还有一个link地址和时间用户点击地址弹出地址表单。所有这些子表单基本上都会构建配置文件模型。
在创建用户的那一刻,配置文件与用户一起构建并相应地连接。
完成这项工作的最佳方法是什么?
一种方法是为每个部分创建单独的控制器。因此,您可能有 PersonalDetailsController
、AddressesController
等。
然后,我的做法是创建一个普通的旧 Ruby 对象,我的命名与控制器一致。所以,我会有 PersonalDetailsManager
、AddressesManager
等。这些“经理”(有些人称他们为 '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
我喜欢这种方法的一些地方:
- 它在我的视图、控制器和
楷模。
- 测试 PORO 比测试控制器容易得多,
海事组织。
- 您可以使用管理器来管理交易
多个模型(可能使用实际交易块来
管理失败的模型交互)。
- 根据您的要求,您可以跨控制器使用管理器并保持方法来源的透明度。
我有一个使用设计和配置文件模型设置的用户模型。用户 has_one 个人资料和个人资料属于一个用户。
配置文件表单很长,包含 10 个以上的字段,我想要做的是创建一个带有 links 的边栏到配置文件模型的较小部分。
例如profile model采用perusal details,所以有一个link个人资料,当用户点击个人资料时,他可以输入个人资料,还有一个link地址和时间用户点击地址弹出地址表单。所有这些子表单基本上都会构建配置文件模型。
在创建用户的那一刻,配置文件与用户一起构建并相应地连接。
完成这项工作的最佳方法是什么?
一种方法是为每个部分创建单独的控制器。因此,您可能有 PersonalDetailsController
、AddressesController
等。
然后,我的做法是创建一个普通的旧 Ruby 对象,我的命名与控制器一致。所以,我会有 PersonalDetailsManager
、AddressesManager
等。这些“经理”(有些人称他们为 '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
我喜欢这种方法的一些地方:
- 它在我的视图、控制器和 楷模。
- 测试 PORO 比测试控制器容易得多, 海事组织。
- 您可以使用管理器来管理交易 多个模型(可能使用实际交易块来 管理失败的模型交互)。
- 根据您的要求,您可以跨控制器使用管理器并保持方法来源的透明度。