2014-01-22 24 views
1

我有一個要求,當創建一個新的Foo對象和一個唯一的字段foo_id已經存在,我必須重定向到該foo_id的編輯頁面。 我使用jQuery自動完成與foo_id文本框已經和想知道什麼是最好的方式來做到這一點?如果字段已存在,則從Rails新窗體重定向到編輯?

我最初的想法是在JSON中返回一個額外的isExist屬性,該屬性返回到jQuery自動完成並基於選擇foo_id,我將檢查isExist屬性並重定向。 有沒有更好的方法來做到這一點?另外,如果我需要從JavaScript進行重定向,我應該從Rails生成路徑嗎?

回答

0

有很多方法可以做到這一點,但一個簡單的方法是將一個ajax GET請求(在自動完成的更改事件上)以所選Foo實例的id發送到控制器端點。用id進行查找。如果存在該ID的實例,則返回200;否則,返回404.所以,你將分別有成功和錯誤處理程序來處理這些情況。

在這一點上,你可以做更多的事情。您的REST端點可以在200響應的主體中發送foo_path(foo)的結果(請記住您擡頭foo)。您可以在所有不同的foo_path(:id)的客戶端上保留一份對應於您的自動填充選項的列表,並在成功時選擇正確的列表。無論哪種方式,您都可以將JavaScript中的document.location設置爲正確的路徑。

可能還有很多其他的東西會指出我敢肯定。

+0

謝謝,Vidya。我意識到我應該澄清foo_id不是記錄的主鍵。 ID是。有沒有辦法按照你的建議發送foo_id作爲參數? – user1279437

+0

這不會改變任何東西。我編輯了我的答案,希望更清楚。 – Vidya

1

基於維迪亞的答案,發現與其他問題的結果,這是我做的:

在Foo的控制器

補充說:

def checkFooExists 
    @foo = Foo.find_by_foo_id params[:foo_id] 
    if [email protected]? 
     flash[:notice] = 'You entered an existing Foo ID, so here is the edit page' 
     flash.keep(:notice) 
     render :js => "window.location = '" + edit_foo_path(@foo) + "'" 
    else 
     render :nothing => true, :status => 409  
    end 
    end 

在路線改變:

#resources :foos 
    resources :foos do 
    collection do 
     get 'checkFooExists' 
    end 
    end 

中的應用.js,在自動完成事件處理程序中爲文本框選擇添加一條jQuery獲取行:

 select: function(event, ui) { 
      $.get("/foos/checkFooExists", { foo_id: ui.item.foo_id }); 
      $('#bar').val(ui.item.bar); 
      return false; 
     } 
+0

很高興幫助。祝你的項目好運! – Vidya

相關問題