2017-07-12 26 views
0

比方说,我有一个模型我如何获得rails来自动填充动态生成的表单?

class A < ApplicationRecord 
    serialize :vals, Array 
end 

存储值的数组。我如何动态填充表单值列表?我的第一个猜测是写

<%= @a.vals.each_with_index do |v, i| %> 
    <%= f.text_field :hints %> 
<% end %> 

但这是给我的错误。

+1

从广义上来说,'A.vals'是错误的,因为你声明'vals'是一个序列化的字段,可以从'A'的_instance_而不是类对象来访问。 'serialize:vals,Array'看起来不对,因为'Array'不是一个序列化类。没有更多信息,将无法获得更具体的信息。示例表单的“form_for”或“form_tag”是什么? vals是如何初始化的? –

+0

您应该将错误添加到您的问题。而且,@AdamLassek也这么说。 (虽然,'serialize:vals,Array'可能是正确的基于[这个答案](https://stackoverflow.com/questions/19134235/how-to-add-to-a-serialized-array) - 不是100%当然) – jvillian

+0

@AdamLassek serialize:vals,Array works – user1876508

回答

2

提交此表单

<%= form_for @a do |f| %> 
    <% @a.vals.each do |val| %> 
    <%= f.text_field :vals, value: val, multiple: true %> 
    <% end %> 

    <%= f.submit %> 
<% end %> 

通过在PARAMS到控制器"a"=>{"vals"=>["first", "second", "third"]}

正如在评论中提到的,你想看看A的实例vals而不是类A

注意有关serialize(更多的评论说,它看起来是错误的)我从来没有使用过它,serialize :vals, Array似乎是为我工作

A.create(vals: ['hint 1', 'hint 2']); A.last.vals 
# (0.2ms) BEGIN 
# SQL (0.4ms) INSERT INTO ... [["vals", "---\n- hint 1\n- hint 2\n"]... 
# (0.6ms) COMMIT 
# A Load (0.3ms) SELECT "as".* FROM "as" ORDER BY "as"."id" DESC LIMIT $1 [["LIMIT", 1]] 
# => ["hint 1", "hint 2"] 
+0

这工作完美!谢谢 – user1876508

+0

另外,我为A. – user1876508

+0

的实例做了一个拼写错误。仔细检查'serialize'的源码之后,似乎传递一个像'Array'这样的非编码类会导致它默认为'YAMLColumn',将反序列化的数据传递给'Array.new'。所以这里有一些令我困惑的魔法。 –

相关问题