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

How do you handle serialized edit fields in an Active Admin resource?

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

1
2
3
4
5
6
7
8
9
> 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) =========================================

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

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

为此模型创建ActiveAdmin资源

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 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字段中保存了以下数组:

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

更改方式:

1
2
3
4
5
6
      form do |f|
        f.inputs"Domain" do
          f.input :names
        end
        f.buttons
      end

,以便在加载edit表单时,在文本字段中看到a,b,c而不是abc


以下是我如何处理此情况的摘要。我在模型中添加了一个访问器,该访问器可以将Array变成由换行符连接的字符串,然后将其拆分回Array。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# app/models/domain.rb
class Domain < ActiveRecord::Base
  serialize       :names, Array
  attr_accessor   :names_raw

  def names_raw
    self.names.join("\
"
) unless self.names.nil?
  end

  def names_raw=(values)
    self.names = []
    self.names=values.split("\
"
)
  end
end

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

1
2
3
4
5
6
7
# 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上使用了此解决方案:

1
2
3
4
5
6
7
8
def target_raw
  @attributes['target'].serialized_value
end

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