2017-06-12 2 views
0

レールを使用してページを作成しようとしています。このページでは、ユーザーはページ内で使用可能なリストから項目を選択することができ、選択したすべての項目を表示できる必要があります。これを行うために、私は次のコントローラとビューを作成しました:レンダリング後のローカル変数の値を保持する

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のデフォルトのセッションストアがクッキー内にあるため、セッションは正常です。しかし、クッキーは4KBのデータしか保持できず、ネットワークトラフィックに追加されます。これらのデータは、ブラウザのローカルストレージに保存することをお勧めします。これは、ボリュームがはるかに大きく、サーバーに転送されることがないためです。 – Aetherus

+0

詳細については、[ローカルストレージAPI](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage)を参照してください。それはJavascriptです。 – Aetherus

関連する問題