【问题标题】:How do you handle serialized edit fields in an Active Admin resource?您如何处理 Active Admin 资源中的序列化编辑字段?
【发布时间】:2011-11-17 23:57:44
【问题描述】:

我有一个模型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

【问题讨论】:

  • 为什么不在模型中使用attr_setter和attr_getter,并实现转换字符串数组。你可以在那里处理它,我打赌你会在应用程序的其他部分需要它

标签: ruby ruby-on-rails-3 activeadmin


【解决方案1】:

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

# 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 字段。设置此值将使用新值保存名称数组。

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

【讨论】:

  • 好主意。一些小修复:attr_accessor 不应该存在,value 应该重命名为 values
  • 您应该使用/[\r\n]+/ 拆分,否则在OSX 上\r 不会被剥离
  • 你不需要这行attr_accessor :names_raw
  • 这是一个绝妙的建议!我还用 squish 清理了输入: ... values.split("\n").map { |row|行.squish }
  • 这是一个好的开始,但是你需要在 ActiveAdmin 中点击“更新”后修改属性,使用控制器 do def update end end跨度>
【解决方案2】:

偶然发现了这个问题,正在寻找可以访问序列化 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2014-05-15
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多