2014-03-04 18 views
0

我正在使用遠程表單從多個不同位置更新某個模型的應用程序。我正在尋找一種模式來更新此模型後動態調用正確的JS回調。Rails - 多個遠程表單觸發相同的控制器操作?

使用正常形式,可以通過在表單中​​傳遞重定向url,然後重定向到控制器中的這個url來解決。遠程表單方面更難:我應該傳遞一個文件名嗎?我應該傳遞一個任意字符串,然後在單個.js.erb文件中打開該字符串?還有其他建議嗎?

這只是一個標誌,應該重新構造應用程序以防止從多個位置更新相同的模型?

+0

可重用性是面向對象編程的特點之一,因此對同一事物使用不同的代碼並不好。也許你應該傳遞一個隱藏的表單參數或url參數(分別爲POST/GET表單),然後打開並從你的控制器渲染(可能導致不同的視圖) –

回答

2

不,這很好如果你可以從不同的位置調用相同的控制器動作。

您的選擇:

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); 

4)使用微件的寶石,最流行的是apotomocells

5)只需在控制器中使用一種情況來渲染不同的視圖。

希望這可以幫助,讓我知道你是否需要澄清。

+0

不幸的是,你建議的第一個選項不會工作,因爲我們會根據更新的位置更新不同的UI組件。 第二個選項不起作用,因爲我們實際上並不想要刷新頁面。 第三個選項很吸引人,但問題就變成了如何正確地傳遞html來填充每個單獨的組件,特別是來自此位置的響應? – JJK

+0

我已經更新了第3號並且增加了第4號。聽起來像這樣可能很適合小部件。 –

+0

謝謝皮埃爾,認爲我們今後使用的答案是否定的。來自「簡明英漢詞典」它並不總是很漂亮,但如果你留意一下,我們似乎能夠控制住它 – JJK

相關問題