2013-03-02 90 views
0

我在局部渲染三次(对于相同的三个场)中有一个窗体。但是,每个字段的占位符值理想情况下应该不同。因此,我试图传入一个局部变量,该局部变量将会对部分的每个渲染进行更改。创建动态局部变量并将其传递给局部变量

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

@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 

所以我猜数组变量是'无'。为什么?

在partial中,在重新填充错误消息和表单字段的情况下,不会有占位符(如果没有错误,只会在控制器中创建@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阵列I环缠部分,它的渲染部分,很多次3 * 3

3.times {@question.answers.build} 

回答

0

在控制器,具有占位符值的阵列一起,我做

@i = 0 

的forms_for部分正在呈现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 %> 
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 %> 
+0

我想我忘了包含一些关键信息。如果您有时间,请参阅OP中的更新。 – Leahcim 2013-03-02 04:10:23