(同じ 3 つのフィールドに対して) 3 回レンダリングするパーシャルのフォームがあります。ただし、各フィールドのプレースホルダー値は異なることが理想的です。したがって、パーシャルのレンダリングごとに変更されるローカル変数を渡そうとしています。
コントローラーでは、このような配列を作成しました
@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 %>
アップデート
コントローラーでは、質問モデル用に 3 つの回答フィールドを作成しています。このため、パーシャルは自動的に 3 回レンダリングされます。パーシャルをラップした @placeholder 配列をループすると、パーシャルがさらに 3 * 3 倍レンダリングされます。
3.times {@question.answers.build}