我已通过“平坦化”在视图中阵列和 重构控制器中的阵列解决了这个问题。
模型也需要进行一些更改,请参见下文。
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个文本字段,favorite_colors_0,favorite_colors_1等
<% 10.times do |key| %>
<%= form.label :favorite_color %>
<%= form.text_field "favorite_colors_#{key}", :value => @user.favorite_colors[key] %>
<% end %>
在控制器中,我必须合并favorite_colors_ *文本字段到一个数组前调用 节省或update_attributes方法:
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。但我们仍然会有一个限制。欢迎您提出如何消除此限制的建议。
希望你觉得这篇文章有用。
谢谢,但我的问题是关于如何在窗体中显示此数组属性以允许编辑此字段。 –
哦对不起 - 误会了......即使我编辑了这个问题 - 我的错 – awenkhh