10

我们在 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 Form Helpers 相关的问题,用于序列化数组属性。

谢谢

4

3 回答 3

4

如果您想要多选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]
于 2012-11-22T19:08:12.967 回答
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 个文本字段,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 %>

在控制器中,我必须在调用 save 或 update_attributes 之前将 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。但我们仍然有一个限制。欢迎您就如何删除此限制提出建议。

希望你觉得这篇文章有用。

于 2012-11-23T17:23:56.593 回答
2

要允许访问 AR 属性,您必须像这样授予它们:

class User < ActiveRecord::Base
  serialize :favorite_colors, Array
  attr_accessible :favorite_colors
  ....
end
于 2012-11-22T18:32:43.703 回答