How do you handle serialized edit fields in an Active Admin resource?
我有一个模型
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 |
,以便在加载
以下是我如何处理此情况的摘要。我在模型中添加了一个访问器,该访问器可以将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 |
然后,在域的管理资源中,我使用
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 |
在此问题上迷迷糊糊,寻找可以访问序列化的
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 |