如何处理Active Admin资源中的序列化编辑字段?

我有一个模型, Domain ,它有一个文本字段, names

 > rails g model Domain names:text invoke active_record create db/migrate/20111117233221_create_domains.rb create app/models/domain.rb > rake db:migrate == CreateDomains: migrating ================================================== -- create_table(:domains) -> 0.0015s == CreateDomains: migrated (0.0066s) ========================================= 

我将此字段序列化为模型中的数组。

 # app/models/domain.rb class Domain < ActiveRecord::Base serialize :names, Array end 

为此模型创建ActiveAdmin资源

 > rails g active_admin:resource Domain create app/admin/domains.rb 

然后,在app / admin / domains.rb中,我设置了各种块来处理序列化字段

 # app/admin/domains.rb ActiveAdmin.register Domain do index do id_column column :names do |domain| "#{domain.names.join( ", " ) unless domain.names.nil?}" end default_actions end show do |domain| attributes_table do row :names do "#{domain.names.join( ", " ) unless domain.names.nil?}" end end end form do |f| f.inputs "Domain" do f.input :names end f.buttons end # before we save, take the param[:domain][:name] parameter, # split and save it to our array before_save do |domain| domain.names = params[:domain][:names].split(",") unless params[:domain].nil? or params[:domain][:names].nil? end end 

几乎所有东西都很棒 – 我的名字在索引和节目视图中以逗号分隔显示。 当我将我的名字字段设置为“a,b,c”更新记录时,before_save会将其转换为一个数组,然后通过ActiveRecord序列化保存。

我无法解决的是如何使编辑表单以逗号分隔的列表放入文本字​​段。 我尝试直接使用部分和使用formtastic语法,并尝试通过active_admin DLS语法使其工作。 有谁知道如何使这项工作?

具体来说,如果我在domain.names字段中保存了以下数组:

 # array of names saved in the domain active_record domain.names = ["a", "b", "c"] 

如何改变:

  form do |f| f.inputs "Domain" do f.input :names end f.buttons end 

因此,当加载edit表单时,在文本字段中而不是看到abc ,您会看到a,b,c

以下是我如何处理这种情况的摘要。 我添加了一个模型的访问器,它可以将Array转换为由换行符连接的字符串并将其拆分回Array。

 # app/models/domain.rb class Domain < ActiveRecord::Base serialize :names, Array attr_accessor :names_raw def names_raw self.names.join("\n") unless self.names.nil? end def names_raw=(values) self.names = [] self.names=values.split("\n") end end 

然后,在我的域管理资源中,我使用了:names_raw字段,而不是使用:names字段。 设置此值将使用新值保存名称Array。

 # app/admin/domains.rb form do |f| f.inputs "Domain" do f.input :names_raw, :as => :text end f.buttons end 

偶然发现这个问题寻找可以访问序列化Hash的YAML的东西。 我在Rails 3.2上使用了这个解决方案:

 def target_raw @attributes['target'].serialized_value end def target_raw=(new_value) @attributes['target'].state = :serialized @attributes['target'].value = new_value end