2016-09-17 66 views
0

當我使用一個支架來生成一個Foo模型/控制器,我的控制器具有默認創建的行動,將render :new如果@foo.save返回false。渲染如何處理實例變量?

會發生什麼事我@foo對象時,我render :new

我的股票new.html.erb視圖是指@foo.errors,這讓我覺得它重用從我的創建行動@foo(而不是在新的方法重新創建@foo = Foo.new一個新的對象)。這不是這種情況嗎?

我很擔心這個,因爲我想在一個新的命名空間控制器中重用這個約定(其他所有東西都是平等的),但是當render :new發生時,我會得到nil爲@foo。它似乎既不重複使用Foo對象,也不創建新對象。所以我試圖更好地理解渲染。

回答

1

render不叫行動new,它只是處理文件new.html.erb(或其他),並將其發送給瀏覽器。在渲染模板時使用創建操作中創建的@foo實例變量,這就是爲什麼,如果記錄未能保存,表單呈現時的用戶信息仍然存在於表單字段中(假設表單設置正確)。

如果你想用新鮮@foo實例變量開始了一個全新的要求,您可以redirect_to :new,而不是渲染,或者只是手動調用render之前設置@foo = Foo.new

如果你有一個'新命名空間控制器',這(不言而喻)不是相同的控制器。目前還不清楚你在做什麼,但如果你在一個控制器中設置@new,然後嘗試從另一個控制器訪問它......這永遠不會工作。

1

從文檔

如果你想呈現對應於不同的模板相同的控制器內的視圖中,您可以使用帶有視圖名渲染:

所以, render用於呈現視圖模板,並不實際調用該操作。要呈現的視圖的名稱可以是stringsymbol

render 'new' # renders new.html.erb 

render :new # renders new.html.erb 

所以,在你的情況下,執行時render :newcreate行動,所有的控制器併爲呈現new.html.erb傳遞實例變量@foocreate行動。這就是爲什麼當保存記錄失敗時,您可以在視圖中看到@foo.errors.full_messages,因爲@foo引用了無效對象。

總之,render只是使您指定和不調用一個動作重新創建對象的模板。

,你傳遞給render方法的參數不必是action名。您也可以將路徑傳遞給實際的視圖文件。

獲取有效參數的完整列表,請參閱http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

希望這有助於部分2.2.4。