Ruby on rails 创建动态局部变量并将其传递给partials

Ruby on rails 创建动态局部变量并将其传递给partials,ruby-on-rails,Ruby On Rails,我有一个部分的表单,它渲染了三次(对于相同的三个字段)。但是,每个字段的占位符值在理想情况下应该不同。因此,我试图传入一个局部变量,该变量将在每次渲染局部对象时发生变化 在控制器中,我创建了如下数组 @placeholder = %w[ firstplaceholder, secondplaceholder, thirdplaceholder] 然后,我尝试在渲染部分图像时循环数组 <%= f.fields_for :answers do |builder| %>

我有一个部分的表单,它渲染了三次(对于相同的三个字段)。但是,每个字段的占位符值在理想情况下应该不同。因此,我试图传入一个局部变量,该变量将在每次渲染局部对象时发生变化

在控制器中,我创建了如下数组

@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变量是‘nil’。为什么?

在分部中,如果有错误消息并且表单字段被重新填充,则不会有占位符(只有在没有错误的情况下,@placeholder实例变量才会在控制器中创建),因此我首先检查@placeholder实例变量是否存在,并尝试将占位符设置为在循环中创建的索引,但是,由于传入arrayindex时出错,占位符不起作用。可能还有其他问题:)


首先,请注意,此处不需要逗号分隔符:

@placeholder = %w[ firstplaceholder secondplaceholder thirdplaceholder]
您不需要在数组中使用索引(如果我理解您的意图的话)。因此,它应该简单到:

<%= f.fields_for :answers do |builder| %>
  <% @placeholder.each do |k| %>
    <%= render :partial => 'answer_fields', :locals => { :f => builder, :myplaceholder => k } %>
  <% end %>
<% end %>

'answer_fields',:locals=>{:f=>builder,:myplaceholder=>k}%>

在控制器中,连同占位符值数组,我做了

@i = 0
由于我创建了4个答案,partial的表单_被渲染了4次

4.times {  @question.answers.build}
因此,在每次呈现分部之后,我递增@I实例变量,并将递增的值传递到@placeholder数组
@placeholder[@I]
,并在分部内部使用数组的适当元素

  <%= f.fields_for :kanswers do |builder| %>
  <%= render :partial => 'kanswer_fields', :locals => { :f => builder, :k => @placeholder[@i]} %>
  <% @i += 1 %> 

  <% end %>

'kanswer_fields',:locals=>{:f=>builder,:k=>@placeholder[@i]}%>

我想我忘了包括一些关键信息。如果有时间,请参阅OP中的更新。
@i = 0
4.times {  @question.answers.build}
  <%= f.fields_for :kanswers do |builder| %>
  <%= render :partial => 'kanswer_fields', :locals => { :f => builder, :k => @placeholder[@i]} %>
  <% @i += 1 %> 

  <% end %>