我有一个部分呈现三次(对于相同的三个字段)的表单。但是,理想情况下,每个字段的占位符值应该不同。因此,我试图传入一个局部变量,该变量将随着局部的每次渲染而改变。
在控制器中,我创建了一个这样的数组
@placeholder = %w[ firstplaceholder, secondplaceholder, thirdplaceholder]
然后我尝试在渲染部分时遍历数组
<%= f.fields_for :answers do |builder| %>
<% @placeholder.each do |k, arrayindex| %>
arrayindex = @placeholder.index(k)
<%= render :partial => 'answer_fields', :locals => { :f => builder, :myplaceholder => @placeholder[arrayindex] } %>
<% end %>
<% end %>
将 arrayindex 传递给 @placeholder 会生成此错误
no implicit conversion from nil to integer
所以我猜arrayindex变量是'nil'。为什么?
在部分内部,在有错误消息并且重新填充表单字段的情况下,不会有占位符(@placeholder 实例变量只有在没有错误的情况下才会在控制器中创建),所以我首先检查 @placeholder 实例变量存在,并尝试将占位符设置为循环中创建的索引,但是,由于传递数组索引的错误,它不起作用。可能还有其他问题:)
<% if @placeholder ? myplaceholder = @placeholder[arrayindex] : myplaceholder = "answer choice" %>
<%= f.text_field :content, :class => 'span3', :rows => 1, :placeholder => myplaceholder %>
<%= f.label :correctanswer, "Correct?" %>
<%= f.check_box :correctanswer, :class => 'span1' %>
<% end %>
更新
在控制器中,我正在为问题模型构建三个答案字段。因此,部分会自动渲染三次。如果我遍历包裹在部分周围的@placeholder 数组,它会将部分渲染多次 3 * 3。
3.times {@question.answers.build}