【问题标题】:How to show a serialized Array attribute for a Rails ActiveRecord Model in a form?如何在表单中显示 Rails ActiveRecord 模型的序列化数组属性?
【发布时间】:2012-11-22 18:20:46
【问题描述】:

我们在 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 for serialized array attribute的问题。

谢谢

【问题讨论】:

    标签: ruby-on-rails forms


    【解决方案1】:

    如果您想要多选 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]
    

    【讨论】:

    • 感谢您的评论。但是,我不希望用户从预定义颜色列表中进行选择。我希望用户自己在一系列文本框中输入颜色。每种颜色一个文本框。我可以为此使用一些表单助手吗?还是我必须自己编写代码,例如在表单中创建“虚拟”属性,然后在控制器中调用 update_attribites 之前将它们合并到一个数组中?
    【解决方案2】:

    我已经通过“展平”视图中的数组解决了这个问题,并且 在控制器中重构数组。

    模型中也需要进行一些更改,见下文。

    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。但我们仍然有一个限制。欢迎您就如何取消此限制提出建议。

    希望这篇文章对您有用。

    【讨论】:

      【解决方案3】:

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

      class User < ActiveRecord::Base
        serialize :favorite_colors, Array
        attr_accessible :favorite_colors
        ....
      end
      

      【讨论】:

      • 谢谢,但我的问题是关于如何在表单中显示此数组属性以允许编辑此字段。
      • 哦抱歉 - 误解了......即使我编辑了问题 - 我的错
      猜你喜欢
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多