重构FatRecord 模型的7种模式 - 这是一篇关于使用PORO的不同重构方法的精彩文章.在第三个标题下有一个Form Object模式,我非常喜欢并且已经在其中一个项目中实现了.只有一个使用一个嵌套资源的示例,但我想为多个嵌套资源实现此模式.也许这里有人已经处理过这个问题?我不一定需要任何代码示例,只是基本的想法会很好.
更新
考虑这个例子.我有两个型号.
class Company
has_many :users
accepts_nested_attributes_for :users
end
class User
belongs_to :company
end
Run Code Online (Sandbox Code Playgroud)
对于使用表单对象模式的公司的一个嵌套用户,我将编写以下内容:
<%= form_for @company_form do |f| %>
<%= f.text_field :name %>
<%= f.text_field :user_name %>
<%= f.submit %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
表格对象
class CompanyForm
include Virtus
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
attr_accessor :company, :user
def user
@user ||= company.users.build
end
def company
@company ||= Company.new
end
def submit(params={})
company.name = params[:name]
user.name = params[:user_name]
persist!
end
private
def persist!
company.save!
user.save!
end
end
Run Code Online (Sandbox Code Playgroud)
但是,如果我有一个表单,可以创建一个拥有多个用户的公司.通常的方法是使用nested_form这样写它:
<%= nested_form_for @company do |f| %>
<%= f.text_field :name %>
<%= fields_for :users, do |user_form| %>
<%= user.form.text_field :name %>
<% end %>
<%= f.link_to_add "Add a user", :users %>
<%= f.submit %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
我要问的是在这种情况下如何实现表单对象模式?
sch*_*pet 12
rails fields_for helper 检查以下格式的方法:#{association_name}_attributes=
所以,如果你将这个方法添加到CompanyForm:
def users_attributes=(users_attributes)
# manipulate attributes as desired...
@company.users_attributes= users_attributes
end
def users
company.users
end
Run Code Online (Sandbox Code Playgroud)
该fields_for发电机将产生嵌套的用户领域的CompanyForm就好像它是一个公司.由于方法中没有发生任何事情,因此上述内容可以重写为代表团:
delegate :users, :users_attributes=, :to => :company, :prefix => false, :allow_nil => false
Run Code Online (Sandbox Code Playgroud)