创建动态局部变量并将其传递给局部变量

时间:2013-03-02 02:05:29

标签: ruby-on-rails

我有一个部分的表单,呈现三次(对于相同的三个字段)。但是,理想情况下,每个字段的占位符值应该不同。因此,我正在尝试传入一个局部变量,该变量将针对partial的每次渲染进行更改。

在控制器中,我创建了一个像这样的数组

@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实例变量存在,并尝试将占位符设置为在循环中创建的索引,但是,由于传入arrayindex的错误,它不起作用。可能还有其他问题:)

    <% 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}

2 个答案:

答案 0 :(得分:2)

首先,请注意您不需要这里的逗号分隔符:

@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 %>

答案 1 :(得分:0)

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

@i = 0

form_for partial被渲染了4次,因为我创建了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 %>