簡體   English   中英

如何在 javascript 中使用變量 escape_javascript rails

[英]How to use variable in javascript escape_javascript rails

我在stackoverflow中發現另外兩個帖子是同一主題: How to use variable in javascript escape_javascript rails? 以及如何在 javascript escape_javascript rails 中使用變量?

我應用了暴露的解決方案,不僅沒有工作,而且發生了一些奇怪的事情。 好吧,至少我認為 Ruby 變量在檢查時輸出一個結果而在打印時輸出完全不同的結果是很奇怪的。

我正在開發一個 rails 6 應用程序,其中文件的內容如下:

某事.html.erb

<%= form_with(url: "/graficos/partido", method: "get") do |f| %>
    <%= f.button "ClickMe",
           :class => "btn btn-secondary text-white mr-1 active",
           :value => "Clicked",
           :data  => {
                 disable_with: '<i class="fa fa-spinner fa-spin"></i>'.html_safe
            }
          %>
  <% end %>

  <article class="col-9">
    <div id="resultquery">
    </div>
  </article>

東西.js.erb

var x=[1,2,3]
x=JSON.stringify(x)
var yt = 99

  $("#resultquery").html("<%= j (render :partial => ‘something’,
                                        :locals => {:xt => '_xt_',
                                                    :yt => " + yt + "
                                                    }
                                ).html_safe
                          %>".replace("_xt_", x ));

_something.html.erb

<p><%= xt.inspect    %></p>
<p><%= xt.class    %></p>
<p><%= xt   %></p>
<p><%= yt   %></p>

現在是奇怪的部分。 屏幕上的output顯示如下

"[1,2,3]"
String
_xt_
+ yt +

==================================================== =================

在這個例子中,方法 "…:yt => " + yt + ", … " 生成結果 "+ yt +"(字符串本身而不是 yt 的值)。Jorawar Singh 建議“=+ yt +-” , 即使我不明白這是什么意思,但它沒有起作用。

占位符方法 (.replace(" xt ", x )) 會產生奇怪的結果:

<p><%= xt.inspect    %></p> gives "[1,2,3]", the value I expected to get
<p><%= xt   %></p>          gives _xt_ (xt[0] => “_”, xt[1] => “x”, ...), the string to be replaced in the  something.js.erb file.

我的問題是(q1)我如何傳遞參數,因為其他方法不起作用。 我做錯事情了? (q2) 占位符方法發生了什么? 我在沒有stringify的情況下嘗試了它,第一個結果是“1,2,3”,奇怪的第二個output是一樣的。

經過大量研究,我能夠找出為什么所提出的方法不起作用。 問題是對客戶端-服務器 model 的誤解。

當服務器發現逃逸到 Ruby (<%=... %>) 時,它會用一些東西替換內容。 換句話說:客戶端不會收到 Escape to Ruby 中的任何內容。 考慮到這一點,很容易看出第一種方法( <%= ...:yt => " + yt + " ... %>)注定要失敗:Escape to Ruby 中的內容將被服務器替換,因此永遠不會以這種格式到達客戶。 在這種特殊情況下,服務器將連接所有生成類似“... :yt => + yt + ...”的字符串,這些字符串將被發送到客戶端。

第二種方法是可行的,因為服務器生成並向客戶端發送一個包含類似“... :xt => ' xt ' ... ”的字符串。 輪到它工作的客戶端將xt替換為它想要的參數值。 問題是它的行為就像薛定諤的貓:它的值是' xt '和“[1,2,3]”。 這一定是一些 Ruby 內部,我不知道為什么會發生。

無論如何,由於這兩種方法都不起作用,我通過使用 controller 中的操作設計了一個解決方案,該操作是為了保留參數值而創建的。 在代碼的 JavaScript 部分中,我發送了一個 Ajax 請求來設置控制器#action class 變量中的參數值。 在視圖中,我通過 Json 請求獲得了 controller#action class 變量值。

丑陋(?),但有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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