Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为哈希属性创建表单字段_Ruby On Rails_Ruby_Activerecord_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 为哈希属性创建表单字段

Ruby on rails 为哈希属性创建表单字段,ruby-on-rails,ruby,activerecord,ruby-on-rails-4,Ruby On Rails,Ruby,Activerecord,Ruby On Rails 4,我有一个模型产品,它有一个属性。它将其作为散列存储在单个数据库列中(如下所示) 类产品

我有一个模型产品,它有一个属性。它将其作为散列存储在单个数据库列中(如下所示)

类产品
如何为该属性(散列)创建动态表单字段?我对思想上正确的方式感兴趣(“rails方式”)。我想有必要使用字段\ u作为助手。但我不完全明白怎么做。请告诉我解决这个问题的正确方法

结果,我想得到一个工作形式,如图所示


用户可以在其中添加无限数量的字段,并提供任何属性名称及其值。

简而言之,您希望在表单中的某个位置包含以下内容:

<% @product.properties_hash.each do |k,v| %>
  <%= f.field_for k %>
  <%= f.field_for v %>
  <# link to action that will remove this key/value pair from the serialized hash saved in the database %>
<% end -%>

您必须以某种方式创建一个空白的键和值对(在表单中仅使用表单帮助程序,或者在控制器中将
product
加载到@product后,通过修改它(如@product.add\u blank\u properties方法),将一个空白(ish)键和值对添加到散列本身的末尾)。否则,循环结束时将不会有“空白”字段


我可以在使用以前存在的空行创建一个属性后,详细介绍如何为属性添加一个新的空行,但到目前为止,您应该已经很好地掌握了需要寻找什么来解决这个问题(还有大量的资源(您可能会为此使用
ajax
).

我认为您应该使用rails standard
scaffold
,但在这里您可能需要一些定制

1) 需要为属性声明
资源路由
属性名称
将成为
资源id
2)
索引视图
将迭代属性
散列
以填充相关字段

product.properties.each do |name, value|
   puts name
   puts value
end
2)
Create
如果记录不存在(基于名称),则操作应创建一个记录,否则将给出一个错误

product.properties[:price] = 10
3)
Update
将根据名称查找属性并以哈希方式更新

product.properties[:price] = 25
4)
delete
将根据属性
name

product.properties.delete(:price)

rails方式不需要包含使用单个表的限制,理想情况下,您可以使用非常rails的方式使用两个表来实现这一点。继续

在我看来,您不应该使用活动记录
:存储
来实现此目的

该实现非常适合于开发人员需要存储代码灵活但在任何给定时间点都定义良好的模型元数据的情况。也就是说,您需要在模型中指定键

还有一个问题,您不能对保存的结果序列化文本运行SQL查询

如果您坚持,您可以这样做:

在您的模型中:

class Product < ActiveRecord::Base
  store :properties

  def prop_hash
    self.properties.collect{|k,v| [k,v]}
  end

  def prop_hash=(param_hash)
    # need to ensure deleted values from form don't persist        
    self.properties.clear 
    param_hash.each do |name, value|
      self.properties[name.to_sym] = value
    end  
  end

end
类产品
他认为:

<%= form_for @product do |f| %>
  <% f.object.prop_hash.each do |k,v| %>
    <%= text_field 'product[prop_hash][][name]', k %>
    <%= text_field 'product[prop_hash][][value]', v %>
  <% end %>
<% end %>

然后,您还可以添加一个“添加另一个属性”链接,该链接应使用JS插入另一对输入,其名称分别为
product[prop\u hash][[name]
product[prop\u hash][[value]


很久以前,我推出了一个元数据的自定义实现,它将密钥保存在序列化的XML中,原因之一是它可以在SQL中查询。我博客文章的链接

你希望它看起来怎么样?用户将有哪些选择?你是预先定义键,然后填充值,还是自由形式?你可以从以下几点得到启发:(1)(2)
<%= form_for @product do |f| %>
  <% f.object.prop_hash.each do |k,v| %>
    <%= text_field 'product[prop_hash][][name]', k %>
    <%= text_field 'product[prop_hash][][value]', v %>
  <% end %>
<% end %>