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

sor*_*ens 10 ruby ruby-on-rails-3 activeadmin

我有一个模型,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) =========================================
Run Code Online (Sandbox Code Playgroud)

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

# app/models/domain.rb
class Domain < ActiveRecord::Base
  serialize :names, Array
end
Run Code Online (Sandbox Code Playgroud)

为此模型创建ActiveAdmin资源

> rails g active_admin:resource Domain
    create  app/admin/domains.rb
Run Code Online (Sandbox Code Playgroud)

然后,在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
Run Code Online (Sandbox Code Playgroud)

几乎所有东西都很棒 - 我的名字在索引和显示视图中以逗号分隔显示.当我将我的名字字段设置为"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"]
Run Code Online (Sandbox Code Playgroud)

如何改变:

      form do |f|
        f.inputs "Domain" do
          f.input :names
        end
        f.buttons
      end
Run Code Online (Sandbox Code Playgroud)

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

sor*_*ens 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
Run Code Online (Sandbox Code Playgroud)

然后,在我的域管理资源中: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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个好的开始,但是您需要在 ActiveAdmin 中单击“更新”后使用控制器 do def update &lt;code here to modify serialize data to modify the format&gt; end end 修改属性 (2认同)