如何循环遍历属性和数组以在表单中创建表

时间:2013-04-05 05:02:56

标签: ruby-on-rails

我正在创建一个调查,并且有一堆名为:movie_1:movie_5的列,我想循环以在表单中创建一个表。这样做的最佳方式是什么?

到目前为止,我已经开始如下,但无法弄清楚如何格式化循环。

survey.rb 模型

attr_accessible :movie_1, :movie_2, :movie_3, :movie_4, :movie_5

MOVIES = ["Rocky", "Wayne's World", "The Godfather", "Alien", "Toy Story"]

new.html.erb 调查表

<%= form_for @survey do |f|
  <table>
    <tr>
      <th>Movie Name</th>
      <th>Rating</th>
    </r>
    <% 5.times.each do |n| %>
      <tr>
        <th><%= f.label Survey::MOVIES[n] %></th> # how can I loop through the MOVIES array?
        <th><%= f.text_field :movie_n %></th> # how can I loop through the different columns?
      </tr>
    <% end %>
  </table>
<% end %>

3 个答案:

答案 0 :(得分:5)

在这种情况下,您可能需要考虑制作另一个属于Movie的模型Survey,然后使用嵌套表单显示所有电影/更新它们。

有一些好railscasts here about nested forms

答案 1 :(得分:2)

您可以遍历列,只使用与命名模式匹配的列。

例如

Survey.columns.select{|c| c if c =~ /movie_[0-9]/}.each { |movie_column| puts movie_column }

但更好的解决方案是设置正确的关系,例如 mind.blank 描述。

答案 2 :(得分:1)

这应该有效:

<% Survey::MOVIES.each_with_index do |movie, index| %>
  <tr>
    <th><%= f.label movie %></th>
    <th><%= f.text_field "movie_#{index+1}".to_sym %></th>
  </tr>
<% end %>

然而,mind.blank是对的:在您的调查模型中设置movie_1movie_2等字段是不好的设计。拥有一个属于调查的电影模型会更有意义。