我已经序列化了产品的属性属性
class Product < ActiveRecord::Base
serialize :properties, Hash
产品表 (sqlite3( 具有文本列"属性",其中包含以下内容:
---
:article: shirt
:size: L
:color: red
当我从控制台检索产品的属性时,我获得了一个哈希,我可以毫无问题地修改和保存该哈希。Ruby 完美地序列化和反序列化它。然后,我尝试使用 fields_for 为每个属性构建一个 _form.html.erb,其中包含一个text_field:
<%= form_for(@product) do |f| %>
[....]
<div class="field">
<%= f.fields_for :properties, OpenStruct.new(@product.properties) do |property_form| %>
<%= f.label :properties %><br />
<% @product.properties.keys.each do |k| %>
<%= property_form.label k %><br />
<%= property_form.text_field k, :value => @product.properties[k] %>
<% end %>
<% end %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
当我编辑产品时,此代码会创建 3 个填充正确值的text_fields,但是当我尝试保存它时,我得到:
"错误类型错误:参数'属性'的预期哈希(获取字符串(">
怎么了?我已经阅读了很多类似的问题和一些解决方案,我遵循了类似的不同方法或在 Railscast#403 中建议,但我总是遇到这种错误。我可能错过了一些东西,但我找不到什么。知道吗?(红宝石-2.0.0-p247,导轨 4.0.0(
多谢!
由于我陷入困境并需要一个快速的解决方案,我使用了一个简单的解决方法:我为每个text_field创建了一个变量"property_n",并在保存对象之前将其复制到哈希中。现在编辑表单是这样的:
<% for i in 0..max_num_of_properties %>
<div class="field">
<%= f.label "property_#{i}".to_sym %><br>
<%= f.text_field "property_#{i}".to_sym %>
</div>
<% end %>
产品类别为:
class Product < ActiveRecord::Base
serialize :properties, Hash
before_save do
self.properties = {}
property_names = ProductType.find(product_type_id).get_property_names()
property_names.each_with_index do |name, index|
self.properties[name] = get_property(index)
end
end
def get_property(index)
send("property_#{index}")
end
哈希现在可以完美地序列化。对于一些JS行,我在编辑表单中显示了正确的属性数量和名称(来自ProductType(。我知道这不是完美的解决方案,但它可能对某人有用......