我们在Rails中使用ActiveRecord的“序列化”功能,如下所示:
class User < ActiveRecord::Base
serialize :favorite_colors, Array
....
end
所以我们可以
u = User.last
u.favorite_colors = [ 'blue', 'red', 'grey' ]
u.save!
所以基本上ActiveRecord正在序列化上面的数组并将其存储在一个名为favorite_colors的数据库字段中。
我的问题是:如何让用户在表单中输入自己喜欢的颜色? 你使用一系列文本字段吗?一旦他们进入,你如何在表格中显示他们进行编辑?
这是与序列化数组属性的Rails表单助手相关的问题。
由于
答案 0 :(得分:3)
如果您想要多选 HTML字段,请尝试:
= form_for @user do |f|
= f.select :favorite_colors, %w[full colors list], {}, :multiple => true
如果您使用的是simple_form gem,则可以轻松地将选项显示为复选框:
= simple_form_for @user do |f|
= f.input :favorite_colors, as: :check_boxes, collection: %w[full colors list]
答案 1 :(得分:3)
我通过'展平'视图中的数组解决了这个问题 重构控制器中的数组。
模型中也需要进行一些更改,请参阅下文。
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_ *文本字段合并到一个数组中 save或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。但我们仍有限制。您建议如何删除此限制。
希望您觉得这篇文章很有用。
答案 2 :(得分:2)
要允许访问AR属性,您必须像这样授予它们:
class User < ActiveRecord::Base
serialize :favorite_colors, Array
attr_accessible :favorite_colors
....
end