我试图在单个数据库字段中保存选项的散列。该表单能够将数据保存到数据库,但当我去编辑它时无法再次检索它(例如,除了 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/