2013-04-07 43 views
1
def new 
    @post = Post.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @post } 
    end 
end 

def create 
    @post = Post.new(params[:post]) 
    #something else 
end 

在這裏,因爲當我們實際創建一個新帖子時,我們調用方法create使用Page.new(params [:page]),方法new只能用於調用視圖new.html.erb。那麼爲什麼我們仍然需要在這裏的新方法中使用實例變量@post?爲什麼我們需要新的實例變量?

+0

使用'form_for'產生依賴於對象的形式,因此對於新的行動,它只是造成了空白表格空對象,但你可以重複使用形式的編輯操作和加載現有的Post對象,它會再加載相關領域到表單 – xkickflip 2013-04-07 20:39:21

+0

由於我們已經依賴於形式的對象,爲什麼我們需要在再次使用Page.new創建方法? – ZeroNegOne 2013-04-07 20:43:48

+3

「創建」操作的處理程序與調用「new」操作的處理程序完全不同。每個HTTP請求都會觸發一個全新的Rails調用,它與其他每個HTTP請求都是隔離的。你設置的實例變量最初不再存在 - 你只是有一個新的請求對象,你必須再次處理參數 – Gareth 2013-04-07 20:48:35

回答

2

你不需要任何new實例變量或任何其他操作,但默認情況下,Rails的的腳手架使用它們。使用實例變量會帶來一些小的好處,並且會有一些約定,但坦率地說它是粗糙的代碼,不應該是默認值。在適當的MVC框架中,控制器的實例變量甚至不會被視圖對象看到。

我寧願是明確的,使用局部變量,並將它們傳遞給視圖當地人:

def new 
    post = Post.new 
    respond_to do |format| 
    format.html { render locals: { post: post } } 
    format.json { render json: post } 
    end 
end 

這是更加明確,並使得你的意圖明確。該視圖對於局部變得更加靈活,因爲您不必擔心在從另一個視圖內部渲染局部變量之前設置實例變量。它正確地封裝了數據,並且不會在行動之外暴露您的post

如果你想快速原型/秒殺的東西,你可能會節省使用實例變量幾個字符,但它不是乾淨的代碼。

0

如果你沒有創建一個新的實例變量,那麼你不會有一個模型持有該模型應該是管理數據 - 別說你會爲你的形式加入了很多更鍋爐板而不是使用採用模型的表單助手。如果不使用模型,您完全沒有按照預期使用MVC框架。

現在,一切都這樣說,它絕不做任何事情,它只是下面的Rails所是建立在頂部的MVC結構所需要的手段。不需要任何模式,總是有其他解決方案,只是執行此操作的可接受方法涉及模型 - 儘管是空的模型。

最後,我不知道什麼時候或爲什麼你要因爲new路由通常用於顯示窗體來創建一個對象與JSON一個new路線迴應,而create功能是用來將一個實際上創建了一個新的模型實例。

相關問題