這通過字符串productID
而不是變量哪個== 5
。我怎樣才能傳遞變量,而不是字符串?傳入變量escape_javascript
也試過:
$("#productModal").html("<%= escape_javascript(render 'layouts/modal', :product_id => " + productID + ").html_safe %>");
這也只是輸出的+ productID +
代替5
這通過字符串productID
而不是變量哪個== 5
。我怎樣才能傳遞變量,而不是字符串?傳入變量escape_javascript
也試過:
$("#productModal").html("<%= escape_javascript(render 'layouts/modal', :product_id => " + productID + ").html_safe %>");
這也只是輸出的+ productID +
代替5
如果你想解決您所提供的代碼,你最好做以下幾點:
<script>
$(document).ready(function(){
$(".test").click(function(){
var productID = 5;
$("#productModal").html("<%=j render('layouts/modal', product_id: " + productID + ").html_safe %>");
$("#modal").modal();
});
});
</script>
但是這個代碼有幾個大問題。
不顯眼的
首先,爲什麼您使用<script>
標籤?
這表明你已經把它放在視圖中,這是非常糟糕的做法。
最有效的方法是使用unobtrusive javascript模式,這是Rails的asset pipeline能夠支持:
#app/assets/javascripts/application.js
$(document).on("click", ".test", function(e) {
var productID = 5;
$("#productModal").html(productID);
$("#modal").modal();
});
這不僅意味着你能夠使用這個代碼整個您的應用程序(模塊),也保證你能夠調用正確的
-
無障礙
其次,你會注意到我已經排除了上面的代碼escape_javascript
。
這是因爲資產管道不處理ERB
/Rails
代碼。
Javascript是客戶端; Rails是服務器端的。
這很重要,因爲當你打電話給render
等 - 你的JavaScript將無法做到這一點,除非它是從服務器調用,尤其是如果部分需要一個設置在DOM負載上的變量。
對於這一點,你需要使用ajax
:
#config/routes.rb
get "modal", to: "application#modal"
#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
def modal
@productID = params[:product_id]
respond_to do |format|
format.js { render "layouts/modal", product_id: @productID }
end
end
end
#app/assets/javascript/application.js
$(document).on("click", ".test", function(e) {
var productID = 5;
$.get("modal", {product_id: productID}, function(data) {
$("#productModal").html(data);
$("#modal").modal();
});
});
這裏的一個小小的警告,如果追加.erb
JS文件(javascripts/application.js.erb
),你就可以使用render
。但是,這個只有發生在文件被調用時;因此將任何變量傳遞給partial將不起作用。
更新
這裏到底是什麼工作:
#app/assets/javascripts/application.js
$(document).on("click", ".testinggg", function(e) {
var productID = 5;
$.get("modal", {product_id: productID}, function(data){
$("#productModal").html(data);
$("#modal").modal();
}, "html");
});
據我所知你在前端指定的productID,但你嘗試呈現與可變後端ERB您分配的前端。服務器首先渲染它,並且它不執行任何html/javascript,所以它不知道你的變量。目前還不清楚您嘗試實現的目標,但是您使用此代碼的方式不可行。抱歉。可能如果你想澄清你想要做什麼,我可以給出正確的答案。 – Fedcomp
@Fedcomp我想呈現一個引導模式,這取決於用戶點擊哪個'product'。模式應該根據'product_id'而變化。 – Onichan
您應該在頁面html中放置帶prerendered html和'visible:hidden'的引導模式窗口,然後使用引導方法使其彈出。您應該只在這裏使用JavaScript來實際觸發它。 Erb將獨立渲染它,而不需要JavaScript。 – Fedcomp