每次用户点击链接时,我都想向他显示下一部分数据。我正在为此目的使用实例变量@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 %>
答案 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。