ruby-on-rails - 将 Rails Form Helpers 与序列化的自定义类一起使用

标签 ruby-on-rails ruby serialization activerecord ruby-on-rails-3

我试图在单个数据库字段中保存选项的散列。该表单能够将数据保存到数据库,但当我去编辑它时无法再次检索它(例如,除了 wp_options 字段之外,所有其他字段都已预填充)。

class Profile < ActiveRecord::Base  
 serialize :wp_options  
end

这是我的自定义类:

class WP_Options
 attr_accessor :wp_name, :wp_desc, :wp_limit
end

在我的表单中:

<%= form_for(@profile, :remote => true) do |f| %>
 ...
   <%= f.fields_for :wp_options do |wp_options| %>
      <%= wp_options.text_field :wp_name  %>
   <% end %>
 ...

在我的 Controller 中:

@profile = Profile.new(:wp_options => WP_Options.new)

在我的数据库列“wp_options”中:

--- !map:ActiveSupport::HashWithIndifferentAccess 
wp_name: Test  

如有任何建议,我们将不胜感激。

最佳答案

其实很简单。您需要将类与 reader 方法一起使用。您可以使用不同的方式创建它,但最简单的方法是使用 OpenStruct 类(注意,它将无法看到 OpenStruct 实例方法中的字段...此类无法重新定义方法)。

在你的表单中你应该添加:

<%= f.fields_for :wp_options, @profile.wp_options do |wp_options| %>

您可以使用 f.object.wp_options 而不是 @profile(如果您有动态变量)。

在模型 Profile 中,您应该添加 wp_options 方法。

def wp_options
  OpenStruct.new(self.attributes['wp_options'])
end

在这种情况下,它仅在序列化的 wp_options 是哈希类时才有效。

希望对您有所帮助。

附言。我使用了相同的技术,但是因为我有 type 散列键,OpenStruct 无法创建它,所以我使用了简单的 Struct 类。我有 data 列:

def data
  keys = current_data.keys
  data = attributes[:data]
  Struct.new(*keys).new(*keys.map { |k| data[k] })
end

有点不那么琐碎,但无论如何都是相同的方法(在此之前我已经创建了特殊类,但现在我知道 Struct 是创建此类内容的更好方法。您可以在这里找到更多想法:How do I use hash keys as methods on a class? )

关于ruby-on-rails - 将 Rails Form Helpers 与序列化的自定义类一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3763867/

相关文章:

ruby-on-rails - 无法将图像解析为 URL : undefined method `start_with?' for/\. (?:svg|eot|woff|ttf)$/:Regexp

javascript - Html——如何为输入文本字段添加编辑器?

php - SaaS 应用程序从头开始

ruby-on-rails - Rails 以编程方式检测文件更改

ruby-on-rails - 使用正则表达式根据用户名的最后一个字母更改文本

ruby-on-rails - ActiveRecord::Relation::ActiveRecord_Relation_Link:Class 的未定义方法 `model_name'

ruby - 与 REXML 相关的错误

c# - 是否存在将源代码转换回 CodeCompileUnit 的现有方法?

java - 如何序列化 android.location 类?

python - 将列表序列化为 SQLite