我正在创建一个调查,并且有一堆名为: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 %>
答案 0 :(得分:5)
在这种情况下,您可能需要考虑制作另一个属于Movie
的模型Survey
,然后使用嵌套表单显示所有电影/更新它们。
答案 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_1
,movie_2
等字段是不好的设计。拥有一个属于调查的电影模型会更有意义。