我已经通过“展平”视图中的数组解决了这个问题,并且
在控制器中重构数组。
模型中也需要进行一些更改,见下文。
class User < ActiveRecord::Base
serialize :favorite_colors, Array
def self.create_virtual_attributes (*args)
args.each do |method_name|
10.times do |key|
define_method "#{method_name}_#{key}" do
end
define_method "#{method_name}_#{key}=" do
end
end
end
end
create_virtual_attributes :favorite_colors
end
如果你没有像上面那样定义方法,Rails 会抱怨表单元素的
视图中的名称,例如“favorite_colors_0”(见下文)。
在视图中,我动态创建了 10 个文本字段,favourite_colors_0、favourite_colors_1 等。
<% 10.times do |key| %>
<%= form.label :favorite_color %>
<%= form.text_field "favorite_colors_#{key}", :value => @user.favorite_colors[key] %>
<% end %>
在控制器中,我必须在调用之前将 favorite_colors_* 文本字段合并到一个数组中
保存或更新属性:
unless params[:user].select{|k,v| k =~ /^favorite_colors_/}.empty?
params[:user][:favorite_colors] = params[:user].select{|k,v| k =~ /^favorite_colors_/}.values.reject{|v| v.empty?}
params[:user].reject! {|k,v| k=~ /^favorite_colors_/}
end
我正在做的一件事是硬编码 10,这限制了您可以在 favorite_colors 数组中拥有多少元素。在表单中,它还输出 10 个文本字段。我们可以轻松地将 10 更改为 100。但我们仍然有一个限制。欢迎您就如何取消此限制提出建议。
希望这篇文章对您有用。