2013-03-02 131 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