我想在我的 JavaScript 中使用我的 Controller 变量。
因为这不能直接完成。我用的是gon gem 。 https://github.com/gazay/gon
有了这个,我所做的是在我的基本 Controller 的前过滤器中(它充当所有 Controller 的前过滤器)我做 gon.variable_name = value 在我的 js 文件中我使用 gon.variable_name。这对于整页重新加载效果很好。
但是该变量没有针对 ajax 请求进行更新。
举个例子:
在页面重新加载时,在我的 Controller 中我这样做
gon.variable_name = value1
在我的js中,gon.variable_name
给我value1
。
在我的 Controller 中发出 ajax 请求后,我这样做
gon.variable_name = value2
在我的js中,我仍然只将gon.variable_name
视为value1
。
有什么方法可以在 ajax 请求中更新 gon.variable_name 吗?
谢谢
最佳答案
您可以使用 watch: true
切换为gon
:
#app/views/layouts/application.html.erb
<head>
<%= include_gon(watch: true) %>
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def update_vars
@value1 = User.count
gon.watch.value1 = @users_count
end
end
文档是这么说的。我不同意,但应该可行。
看起来像 ajax polling
这是出了名的低效。
--
为了给您一些背景信息,您必须记住 gon
基本上在你的layout
中创建了一个小的javascript哈希值。 ,用 gon
填充它您在 Controller 中分配的变量:
<script>
gon = {
value1: "test",
value2: "test"
}
</script>
我们之前在这里使用过它:
这很重要的原因是因为 gon
JS 变量在运行时调用——这意味着它保持静态,直到您重新加载页面。
解决这个问题的方法是动态重新加载 gon
变量值(使用上面的 watch
)或通过 ajax 请求传递新值(如评论中推荐的 Sergio
):
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def update
respond_to do |format|
format.json { render json: {value_2: "test"}.to_json %>
end
end
end
然后您就可以按如下方式使用它:
$.ajax({
url: "/update",
success: function(data) {
var value2 = data.value2;
}
});
关于javascript - 在 javascript 中使用 Controller 变量 (Ruby on Rails),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33430944/