我有一个模型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
。
答案 0 :(得分:26)
以下是我如何处理这种情况的摘要。我在模型中添加了一个访问器,它可以将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
字段,而不是使用:names_raw
字段。设置此值将使用新值保存名称Array。
# app/admin/domains.rb
form do |f|
f.inputs "Domain" do
f.input :names_raw, :as => :text
end
f.buttons
end
答案 1 :(得分:0)
偶然发现这个问题,寻找可以访问序列化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