每次在控制器中增加@instance_variable

时间:2016-04-03 08:53:59

标签: jquery ruby-on-rails ajax

每次用户点击链接时,我都想向他显示下一部分数据。我正在为此目的使用实例变量@i

# link in a view
<%= link_to 'Next', user_test_do_path, controller: :do, action: :list_update, user_id: 1, test_id: 2, remote: :true, HERE_WANT_TO_UPDATE_@i %>

# controller and action
class DoController < ApplicationController        
  def list_update
    @i+=1
    @cur_test = Test.where(id: params[:test_id])
    @cur_q_all = Question.where(test_id: @cur_test)
    @cur_q = @cur_q_all[@i] 
    @cur_ans_all = Answer.where(question_id: @cur_q)
  end
end

但是,@i不会递增,并始终保持等于0。 我的问题是:如何在每次点击@i时增加link_to的值?

解决了!这是我最后的工作link_to:

<%= link_to "Next", user_test_answers_all_path(:current_i => @i), action: :list_update, controller: :do, method: :get, remote: :true %>

1 个答案:

答案 0 :(得分:0)

问题是HTTP是无状态协议。根据定义,

  

无状态协议是一种处理每种协议的通信协议   请求作为与任何无关的独立交易   先前的请求,以便通信由独立组成   请求和响应对。

因此,基本上list_update动作对它之前的状态一无所知,直到你明确指定它为止。你在这里可以做的是传递迭代器的当前值以及其他参数:

<%= link_to 'Next', user_test_do_path, controller: :do, action: :list_update, current_i: @i, user_id: 1, test_id: 2, remote: :true%>

在进行增量时将其计算在内:

def list_update
  @i = params[:current_i].try(:to_i)
  @i = @i + 1
  ...

请注意,remote: true表示您应该在成功ajax提交时执行某些操作(例如,使用新数据替换html页面的某些块)。有关详细信息,请参阅Working with Javascript in Rails