2016-03-15 55 views
0

我有一个用户模型与设计和配置文件模型设置。用户has_one个人资料和个人资料属于用户。拆分轨道形式到更小的形式

配置文件表单非常长,需要10个以上的字段,我所要做的是创建一个带有指向配置文件模型的较小部分的链接的侧栏。

例如,个人资料模型需要仔细阅读详细信息,因此当用户点击个人详细信息时,他可以输入个人详细信息和地址链接,当用户点击地址时弹出地址表单。所有这些子窗体将基本上构建轮廓模型。

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

完成这件事的最好方法是什么?

+1

听起来像一个好主意,整体。你有没有具体的问题? – jvillian

+0

我的问题是你如何去做这件事? –

回答

1

一种方法是为每个部分创建单独的控制器。所以,你可能有一个PersonalDetailsController,AddressesController,依此类推。

然后,我的做法是创建一个普通的旧的Ruby对象,并与控制器一致地命名。所以,我会有一个PersonalDetailsManager,AddressesManager,依此类推。这些“managers`(有些人称他们为‘服务’)可能是这个样子:

# 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. 根据您的要求,您可以跨控制器使用管理器,并保持有关方法来源的透明度。