加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 序列化哈希字段和简单格式

发布时间:2020-12-16 21:56:42 所属栏目:百科 来源:网络整理
导读:我有以下 class Page ActiveRecord::Base belongs_to :category serialize :fieldsend 字段的值取决于类别.但作为一个例子; {"address" = "8 finance street,hong kong","founded" = "1973"} 在这个例子中,该类别定义了“地址”和“已建立”作为自定义字段.
我有以下
class Page < ActiveRecord::Base
  belongs_to :category
  serialize :fields
end

字段的值取决于类别.但作为一个例子;

{"address" => "8 finance street,hong kong","founded" => "1973"}

在这个例子中,该类别定义了“地址”和“已建立”作为自定义字段.

我想要的是说

= simple_form_for(@page) do |f|
  = f.association :category
  - f.object.category.fields.each do |field|
    = f.input field.name

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

相反,我应该看看@page.fields [“成立”].

有什么建议么?

更新:

我有点近了

- 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(不想指定对象的名称).

我会看看是否可以为此写一个体面的简单表单扩展.

解决方法

我碰到一个类似的问题,试图在Mongoid模型的Hash字段类型上使用simple_fields_for.我正在处理的你的例子的Mongoid版本看起来像这样:
class Page
  include Mongoid::Document
  field :fields,type: Hash
end

我的情况可能略有不同,尽管我已经知道我正在寻找的哈希键,只需要simple_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的东西混合到我的视图中,我创建了一个用于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

现在我可以使用我原来的天真的解决方案,没有特殊的视图代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读