Rails在ajax调用时更新实例变量,从同一个控制器调用方法

时间:2016-06-10 13:35:00

标签: ruby-on-rails

我有一个由简单的控制器处理的视图:

class CountController < ApplicationController

    def count
        @index = 0
    end
end

在我看来,我刚刚添加了一个按钮:

<%= link_to "Change next day", increase_count_path(@index), :class => 'btn' :remote => true %>

请求由我在CountController中添加的方法处理:

def increase_count
    @index = params[:index].to_i + 1
end

在尝试之后,我看到每次请求被发送到/ increase_count / 0时,所以这显然不会像我希望的那样更新变量。

所以我的猜测是,2没有联系。第一个在视图中有其范围,而第二个,来自increase_count方法,在我将从中呈现的任何javascript中都可见。

如何在Rails中实现这一目标?我试图实现并遇到这个问题的是以下(简化版):我有一个包含3个字符串的数组。首先我展示第一个。单击时,我想进行Ajax调用,增加索引,并显示下一个字符串。但我最后只显示了第二个,因为下一个调用不会更新索引。

1 个答案:

答案 0 :(得分:4)

您的AJAX调用确实会更新控制器中的@index实例变量 ,但是如果您不重新渲染链接,那么它将继续使用初始值@index

考虑在JavaScript模板中重新呈现链接。

E.g。

// inside increase_count.js.erb

// Fetch the link in question and re-render it
// The newly rendered link will use the updated value from the instance variable within the #increase_count action

// Generates the link
// Use the j helper to escape any JavaScript within the text
var link = "<%= j link_to("Change next day", increase_count_path(@index), :class => 'btn' :remote => true) %>";

// Select the link using jQuery and update it
$("...").html(link);

您可能希望将链接转换为部分链接,以避免在视图和JS模板中复制代码。您还希望使用一个好的选择器来更轻松地获取链接。