Ruby on Rails会话变量在第一次渲染时未显示在前端

时间:2016-08-09 11:19:15

标签: ruby-on-rails ruby ajax ruby-on-rails-4 session

我遇到一个奇怪的问题,当第一次渲染部分时,会话数组中的最后一个值没有显示在前端。我使用add_to_box方法将一组值添加到名为' session [:box]'的会话变量中。然后,我想用新的值列表更新前端的部分。

这里是代码......(略微消毒)

控制器:

def add_to_box(values_hash)

  session[:box] ||= []
  if params_valid?(values_hash)

    session[:box].push(values_hash)

    respond_to do |format|
      format.js
    end

  end

end

add_to_box.js.erb:

$("#box").html("<%= escape_javascript(render partial: 'box') %>");

部分_box.html.erb:

<ul>
  <% session[:box].each do |m| %>
    <li>
      <%= "#{m['bottom_id']}, #{m['filling_id']}, #{m['top_id']}" %>
    </li>
  <% end %>
</ul>

控制台输出:

Started POST "/things/add_to_box" for ::1 at 2016-08-09 11:59:23 +0100
Processing by ThingController#add_to_box as JS
Rendered things/_box.html.erb (0.9ms)
Rendered things/add_to_box.js.erb (2.8ms)
Completed 200 OK in 17ms (Views: 8.2ms | ActiveRecord: 0.7ms)

第一次调用该方法(值1,1,1)时,前端显示为:

  

∙,,

第二次调用该方法(值2,2,2)时,前端显示为:

  

∙1,1,1

     

∙,,

第三次调用该方法(值3,3,3)时,前端显示为:

  

∙1,1,1

     

∙2,2,2

     

∙,,

你得到了图片......基本上,最新的值永远不会被渲染。

但如果我刷新页面,它会正确显示所有值:

  

∙1,1,1

     

∙2,2,2

     

∙3,3​​,3

我首先想到的可能是因为这些值并没有及时保存并且渲染首先发生,但是在它们被设置之前它是如何知道有一组新的值?!

需要一些帮助

1 个答案:

答案 0 :(得分:0)

我已经弄清楚了。作为params_valid的一部分?方法我正在做以下事情:

  values_hash[:top_id] = params[:top_id].to_i
  values_hash[:filling_id] = params[:filling_id].to_i
  values_hash[:bottom_id] = params[:bottom_id].to_i

我在session [:box]上添加了一个logger.debug并获得了以下内容:

{"top_id"=>1, "filling_id"=>1, "bottom_id"=>1, "id"=>1}
{"top_id"=>1, "filling_id"=>1, "bottom_id"=>1, "id"=>2}
{"top_id"=>1, "filling_id"=>1, "bottom_id"=>1, "id"=>3}
{"top_id"=>1, "filling_id"=>1, "bottom_id"=>1, "id"=>4}
{:top_id=>1, :filling_id=>1, :bottom_id=>1, :id=>5}

你会注意到最后一行的差异。我将上面的代码更改为以下代码并且有效:

  values_hash["top_id"] = params[:top_id].to_i
  values_hash["filling_id"] = params[:filling_id].to_i
  values_hash["bottom_id"] = params[:bottom_id].to_i

关于这个的奇怪的事情,以及我没有抓住它的原因是当刷新页面时它调用相同的会话[:box]变量并显示正常。在后台必须发生一些事情来整理它。

如果有人可以分享一些关于这个的见解,那么会感兴趣吗