Rails 3序列化表单属性

时间:2011-06-01 19:19:39

标签: ruby-on-rails ruby-on-rails-3

我有以下型号:

class Deck < ActiveRecord::Base
  has_many :cards
  serialize :stats
  attr_accessible :name, :description, :stats
end

在此,stats应该是一个字符串数组。我希望能够在行中添加任意数量的统计数据(使用javascript添加额外的“stat”输入框,但如果问题,则超出范围。)

我的问题是如何在视图中反映这种结构?如果我手动构建表单,那么它将如下所示:

<input type="text" name="deck[stats][]">

我的观点目前看起来像:

<%= f.fields_for :stats, @deck.stats do |p| %>
  <%= p.label :p, "Stats: " %>
  <%= p.text_field :p %>
<% end %>

但是这会输出:

<input type="text" name="deck[stats][p]">

我也想要一个计数器,所以我可以将标签显示为“Stat 1:”,“Stat 2:”等。

感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

发布解决方案,我去帮助未来的读者。

#Controller
def new
  @deck = Deck.new
  @deck.stats = ["", ""]  #include for number of times you wish to show the field.
end


#View
<%@deck.stats.each_with_index do |s,i| %>
  <p>
    Stat <%=i+1%>: <%=text_field "stat", i, :name => "deck[stats][]",  :value => s %>
  </p>
<%end%>

答案 1 :(得分:0)

通过定义:p,你认为你正在寻找一种名为p的统计数据方法,即stats.p

<%= f.fields_for :stats, @deck.stats do |p| %>
  <%= p.label :p, "Stats: " %>
  <%= p.text_field :p %>
<% end %>

而只是尝试<%= p.text_field %>删除:p

答案 2 :(得分:0)

我不知道是否有干净的方法,但这应该有效:

<% @deck.stats.each do |value|
  <%= f.fields_for :stats do |fields| %>
    <%= fields.text_field "", :value => value %>
  <% end %>
<% end %>

答案 3 :(得分:0)

= simple_form_for [:stats, @deck] do |f|
  - 1.upto(4) do |i|
    = f.input_field :stats, multiple: true, label: "Stat #{i}"
  = f.submit