[英]Passing JavaScript variable to ruby-on-rails controller
[英]Use a controller variable in javascript (Ruby on Rails)
我想在我的JavaScript中使用控制器變量。
由於這不能直接做到。 我用寶石。 https://github.com/gazay/gon
這樣,我所做的就是在我的基本控制器的before過濾器中(哪個充當所有控制器的before過濾器)我執行gon.variable_name = value並且在我的js文件中使用gon.variable_name。 這對於整個頁面重新加載都很好。
但是該變量不會針對ajax請求進行更新。
例如說:
在頁面重新加載中,在我的控制器中
gon.variable_name = value1
在我的js中, gon.variable_name
給了我value1
。
在我的控制器中發出ajax請求后
gon.variable_name = value2
在我的js中,我仍然只將gon.variable_name
視為value1
。
有什么辦法可以在ajax請求中更新gon.variable_name?
謝謝
您可以使用watch: true
gon
watch: true
開關:
#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
變量填充它:
<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;
}
});
我必須為每個請求初始化gon以便更新變量。
include_gon(:init => true)
在每個請求的響應中解決了問題。
額外提示:對於使用ajaxify rails gem的用戶,您可以在ajaxify_extra_content方法中調用此輔助方法,而在content_inserted回調中,可以將此方法附加到head標記以使其以常規方式起作用。
感謝您的建議和幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.