2017-06-12 69 views
0

我試圖使用rails創建頁面。在此頁面中,用戶可以從頁面中可用的列表中選擇項目,並且他需要能夠查看他選擇的所有項目。要做到這一點,我創建了下面的控制器和視圖:在Rails中渲染頁面後保留局部變量值

class PropostasController < ApplicationController 
    def new 
    @id_item = params[:id_item] 
    end 

    def ofertar 
    @itens = Item.where(dono_id: session[:id_usuario]) 
    render "new" 
    end 

    def adicionar_item 
    if [email protected]_ofertados 
     @itens_ofertados = [] 
    end 
    @itens_ofertados.push(Item.find(params[:id_item])) 
    render "new" 
    end 
end 

視圖

<h1>Nova Proposta</h1> 
<%= @id_item %> 
<p> 
    Realizar proposta para: 
</p> 
<div> 
    Itens do usuário que receberá a proposta 
</div> 
<div> 
    Itens a serem ofertados: 
    <br> 
    <%= form_tag("/ofertar_item_proposta") do %> 
    <p> 
     <%= submit_tag "Ofertar Item" %> 
    </p> 
    <% end %> 

</div> 
<div> 
<%= render "teste"%> 
</div> 
<div> 
    <br> 
    <h2>Itens ofertados</h2> 
    <%if @itens_ofertados %> 
    <% @itens_ofertados.each do |item| %> 
     <ul> 
     <li><%= item.nome %></li> 
     <li><%= item.descricao %></li> 
     <li><%= item.quantidade %></li> 
     <li><%= item.categoria.nome %></li> 
     <% if item.img_link %> 
      <li><%= image_tag(item.img_link, :size => "260x180") %></li> 
     <% end %> 
     </ul> 
    <% end %> 
    <% end %> 
</div> 
<div> 
    <br> 
    <h2>Itens a serem selecionados</h2> 
    <%if @itens %> 
    <% @itens.each do |item| %> 
     <%= form_tag("/adicionar_item_proposta") do %> 
     <ul> 
      <li><%= item.nome %></li> 
      <li><%= item.descricao %></li> 
      <li><%= item.quantidade %></li> 
      <li><%= item.categoria.nome %></li> 
      <% if item.img_link %> 
      <li><%= image_tag(item.img_link, :size => "260x180") %></li> 
      <% end %> 
     </ul> 
     <ul> 
      <%= hidden_field_tag 'id_item', item.id %> 
      <li><%= submit_tag 'Adicionar a Proposta' %></li> 
     </ul> 
     <% end %> 
    <% end %> 
    <% end %> 
</div> 

我遇到的問題是,當我點擊的視圖的形式之一的提交按鈕,我失去了@itens_ofertados和@itens中的值。我想重新渲染頁面或刷新它,而不會丟失這些變量的先前值,以便它們不斷顯示在頁面中。

回答

0

@itens_ofertados不是局部變量。它是你的控制器的一個實例變量。

對於每個HTTP請求,Rails實例化一個新的控制器實例來處理請求。當請求處理完成時,控制器實例就會死亡。所以前一個控制器的實例變量的值是不可訪問的,因爲該控制器實例不再存在。

最好的解決方案是將歷史記錄存儲在瀏覽器的本地存儲中。

+0

謝謝你的回答,我很抱歉我的錯誤,我沒有太多的使用經驗。要存儲在瀏覽器的內存中,是否需要在會話中存儲或者是否有其他資源來執行此操作? –

+0

會話正常,因爲Rails的默認會話存儲位於Cookie中。但是您應該始終記住,Cookie只能保存4KB的數據,並且它們會累加到網絡流量中。我建議將這些數據存儲在瀏覽器的本地存儲中,因爲它具有更大的容量,並且永遠不會傳輸到服務器。 – Aetherus

+0

有關詳細信息,請參見[本地存儲API](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)。它是Javascript。 – Aetherus