簡體   English   中英

在javascript中使用控制器變量(Ruby on Rails)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM