ruby-on-rails - 序列化哈希字段和简单表单

标签 ruby-on-rails ruby-on-rails-3 serialization simple-form

我有以下内容。

class Page < ActiveRecord::Base
  belongs_to :category
  serialize :fields
end
fields的值将取决于类别。但作为一个例子;
{"address" => "8 finance street, hong kong",
 "founded" => "1973"}

在这个例子中,类别定义了 "address""founded"作为自定义字段。

我想说的是;
= simple_form_for(@page) do |f|
  = f.association :category
  - f.object.category.fields.each do |field|
    = f.input field.name

但我需要做一些魔法来处理 @page.founded 的事实。无效

相反,我应该查看 @page.fields["founded"] .

有什么建议?

更新:

我稍微靠近了一点
- if f.object.category
  - f.object.category.fields.each do |field|
    = f.input field.name do
      = text_field_tag "post[fields][#{field.name}]", f.object.fields[file.name]

现在需要制作这个DRYer(不想指定对象的名称)。

我会看看我是否可以为此编写一个像样的简单表单扩展。

最佳答案

我在尝试使用 simple_fields_for 时遇到了类似的问题在 Mongoid 模型的 Hash 字段类型上。我正在处理的示例的 Mongoid 版本如下所示:

class Page
  include Mongoid::Document
  field :fields, type: Hash
end

不过,我的情况可能略有不同,因为我已经提前知道我正在寻找的哈希键,而且只需要 simple_fields_for使用哈希字段。我使用的幼稚方法(基本 fields_for 用法)如下所示:
= simple_form_for(@page) do |f|
  = f.simple_fields_for :fields do |ff|
    = ff.input :address
    = ff.input :founded

但这并没有正确填充表单。 nicholaides 将散列包装在结构中的解决方案对我有用:
- require 'ostruct'
= simple_form_for(@page) do |f|
  = f.simple_fields_for :fields, OpenStruct.new(@page.fields) do |ff|
    = ff.input :address
    = ff.input :founded

为了避免将 OpenStruct 的东西混入我的 View 中,我为 simple_form 创建了一个猴子补丁。自动将散列类型包装在 OpenStruct 中并将其放入初始化程序:
require 'ostruct'

module SimpleForm::ActionViewExtensions::Builder
  def simple_fields_for_with_hash_support(*args, &block)
    if args[0] && !args[1]
      field = object.send(args[0])
      args << OpenStruct.new(field) if field.respond_to?(:has_key?)
    end
    simple_fields_for_without_hash_support(*args, &block)
  end
  alias simple_fields_for_without_hash_support simple_fields_for
  alias simple_fields_for simple_fields_for_with_hash_support
end

现在我可以在没有特殊 View 代码的情况下使用我原来的天真解决方案。

关于ruby-on-rails - 序列化哈希字段和简单表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9613208/

相关文章:

ruby-on-rails - Rails 嵌套属性未更新

ruby-on-rails - 安装 capybara-webkit (0.12.1) 时无法构建 gem native 扩展

ruby-on-rails - 自动完成搜索的 Rails 实现

ruby - 安装 rmagick 时出错

java - 在 Eclipse 调试器中运行的导出、签名的 apk 和版本之间的差异?导致问题的可序列化类

c++ - 用于 C++(或 C)的 mmap 可加载数据结构库

时间:2019-05-08 标签:c#xmlserializationextrarootnode

ruby-on-rails - TCP 套接字 IO 卡住

ruby-on-rails - Ruby 将字符串数组转换为数组对象

javascript - 从 Rails 中的 Controller 打开弹出窗口