2010-06-06 57 views
1

在我的Rails應用程序中,我希望有一個可排序列表作爲對象創建的一部分。 Railscast中建議的最佳做法是添加acts_as_list插件,然後啓動AJAX調用來更新項目位置。但是,AJAX調用不適用於未保存的模型,這是new的情況。在「新」控制器上執行AJAX調用

一種解決方案是立即將模型保存在new上,並重定向到edit。這樣做會產生很好的副作用,使得用戶可以在中斷的情況下繼續工作。

但是,該解決方案增加了保存無效模型的不必要的複雜性,從而危及了rails的驗證過程。有沒有更好的方法來允許AJAX +驗證,而不會做太多工作?

回答

1

您的操作對任何其他操作都具有相同的參數訪問權限。您可以將未保存的對象的參數傳遞迴新的動作,並將對象重新初始化爲,並將屬性設置返回給視圖。例如:

控制器:

class WidgetsController < ApplicationController 
    def new 
    @widget = params.has_key?(:widget) ? Widget.new(params[:widget]) : Widget.new 
    end 
    .. 
end 

然後在您的視圖你必須通過一個鏈接或表單POST發送PARAMS新的動作。

+0

只是爲了確保我的理解:以後我讓AJAX調用的「新」,我必須運行某種JS邏輯的更新頁?比實現「position」屬性的客戶端緩存更簡單嗎? – shmichael 2010-06-07 10:58:08

+0

不一定,RJS可以爲您處理。例如,如果使用link_to_remote,並將要更新的DOM ID傳遞給:update選項,則新動作返回的任何內容都將放置在頁面上具有該DOM ID的元素中。 – 2010-06-07 14:37:20

0

您可以臨時將未保存的對象存儲在「會話」中。

像(此代碼必須在控制器)

my_model = MyModel.new(params[:my_model]) 
session[:my_model_tmp] = my_model