我正在使用遠程表單從多個不同位置更新某個模型的應用程序。我正在尋找一種模式來更新此模型後動態調用正確的JS回調。Rails - 多個遠程表單觸發相同的控制器操作?
使用正常形式,可以通過在表單中傳遞重定向url,然後重定向到控制器中的這個url來解決。遠程表單方面更難:我應該傳遞一個文件名嗎?我應該傳遞一個任意字符串,然後在單個.js.erb文件中打開該字符串?還有其他建議嗎?
這只是一個標誌,應該重新構造應用程序以防止從多個位置更新相同的模型?
我正在使用遠程表單從多個不同位置更新某個模型的應用程序。我正在尋找一種模式來更新此模型後動態調用正確的JS回調。Rails - 多個遠程表單觸發相同的控制器操作?
使用正常形式,可以通過在表單中傳遞重定向url,然後重定向到控制器中的這個url來解決。遠程表單方面更難:我應該傳遞一個文件名嗎?我應該傳遞一個任意字符串,然後在單個.js.erb文件中打開該字符串?還有其他建議嗎?
這只是一個標誌,應該重新構造應用程序以防止從多個位置更新相同的模型?
不,這很好如果你可以從不同的位置調用相同的控制器動作。
您的選擇:
1)優選地,這個控制器動作可以給出相同的響應,並會爲不同的地點工作,恩。它只是更新一個存在於所有這些位置的id的容器。
2)您注意的是,重定向在過去的事情變得簡單,考慮添加以下到您的應用程序控制器:
def js_redirect_to(path, flash_messages = {})
flash_messages.each { |type, message| flash[type] = message }
respond_to do |format|
format.js { render :js => "window.top.location='#{path}';" }
end
end
這是相同的簽名正常redirect_to時,它只是允許你從重定向一個JS請求。請注意,如果您使用turbolinks,js應該是'Turbolinks.visit(url);'。 3)如果你真的不能像上面的選項一樣處理它,你可以在表單中傳遞你提交位置的JS命名空間,並且控制器爲所有位置調用相同的方法,它只是一個不同的名字空間。例如:
咱們說一個位置是從寵物管理,然後在資產pet.js:
var pet = {
load = function() {
your page load js...
},
... more functions...
post_callback = function(html_segment1, html_segment2) {
this is where you handle the form callback for pets...
$('some_element').html(html_segment1);
$('another_element').html(html_segment2);
}
}
構建更喜歡這些對您的應用程序的其他位置。無論如何,使用這樣的JS命名空間是一個好主意。然後表單提交的參數:位置=>:寵物到控制器,其與響應:
... your JS code that all pages should execute...
html_segment1 = "<%= escape_javascript(render 'some_partial') %>";
html_segment2 = "<%= escape_javascript(render 'other_partial') %>";
<%= @location %>.post_callback(html_segment1, html_segment2);
5)只需在控制器中使用一種情況來渲染不同的視圖。
希望這可以幫助,讓我知道你是否需要澄清。
可重用性是面向對象編程的特點之一,因此對同一事物使用不同的代碼並不好。也許你應該傳遞一個隱藏的表單參數或url參數(分別爲POST/GET表單),然後打開並從你的控制器渲染(可能導致不同的視圖) –