2012-11-22 89 views
10

我们使用ActiveRecord的“序列化”功能类似这样的Rails:如何在表单中显示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有关的序列化数组属性的问题。

感谢

回答

2

要允许访问AR属性,你必须给予他们这样的:

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

谢谢,但我的问题是关于如何在窗体中显示此数组属性以允许编辑此字段。 –

+0

哦对不起 - 误会了......即使我编辑了这个问题 - 我的错 – awenkhh

3

如果你想多选 HTML领域,尝试:

= form_for @user do |f| 
    = f.select :favorite_colors, %w[full colors list], {}, :multiple => true 

如果您使用的是simple_form宝石,您可以选择复选框方便:

= simple_form_for @user do |f| 
    = f.input :favorite_colors, as: :check_boxes, collection: %w[full colors list] 
+1

感谢您的评论。但是,我不希望用户从预定义的颜色列表中进行选择。我希望用户在一系列文本框中输入颜色。每种颜色一个文本框。我能为此使用一些表单助手吗?或者我必须自己编写代码,例如在窗体中创建“虚拟”属性,然后在调用控制器中的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个文本字段,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。但我们仍然会有一个限制。欢迎您提出如何消除此限制的建议。

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

相关问题