2014-06-04 48 views
0

在創建一個新的博客文章的標準方式:實例變量是否從#new通過form_for傳遞到#create?

def new 
    @post = Post.new(post_attr: value) 
end 

<%= form_for @post do |f| %> 
    <%= f.text_field %> 
<% end %> 

在提交表單將調用Posts#create

def create 
    @post = Post.new(post_params) 
    @post.save 
end 

請問這仍然是保存在@postpost_attr

有沒有Rails的方式讓post_attr經過並保存?在我的真實應用程序中,post_attr是post的parent_id(我正在使用嵌套路由)。

+0

要麼你的問題不清楚,要麼你有一個很大的誤解。 *在視圖呈現之前,控制器被執行*。 –

+0

是的,控制器'#new'之前執行,導致'@ post'具有'post_attr'。但是,當我提交表單時,我們現在在'#create'。我的問題是,'#create'處的'@ post'是否仍有'post_attr'或者它是完全不同的對象? – Heisenberg

+1

啊哈,你最好告訴我們你真的想做什麼。但無論如何,這絕對是一個全新的對象。 –

回答

1

當我提交表單時,@ post仍然會有post_attr?

create動作典型地設置了一個實例如下所示:

@post = Post.new(params[:post]) 

的屬性在params散列,這是從發佈包含在請求中的數據設置填充由客戶。如果您在發佈的數據中未包含字段,則不會出現在params中。以「穿越」

一種方式屬性是使用一個隱藏字段:

<%= form_for @post do |f| %> 
    <%= f.hidden_field :post_attrs %> 
    <%= f.text_field %> 
<% end %> 

張貼的值將被序列化就像一個窗體上的任何其他領域,所以你不能隨心所欲的使用方法請撥打此處。

+0

我確實實施了'hidden_​​field',但想知道是否有更好的方法。我會讓別人回答,然後選擇你的答案作爲正確答案。謝謝! – Heisenberg

0

#create @post是一個新對象,包含您從視圖中發現的屬性。

只要您沒有在視圖中對字段進行任何更改,此屬性將與渲染位置相同。

0

ActiveRecord的

@instance variable遍歷不同的動作(其性質而言,它是一個實例變量):

紅寶石 - 什麼可以將對象有哪些?對象可以具有類和 實例變量。這意味着一個類可以有實例 變量。讓我們重新開始我們的多邊形類,並添加一個實例變量 :

-

的方式Rails的持續行動之間的數據來填充ActiveRecord對象。當您調用new操作時,Rails使用Model.new方法創建一個新對象。這基本上會創建一個空對象,然後您可以將其傳遞給幫助器。

一旦form_for幫手有對象,它呈現所需的fields。就鐵軌而言,@instance variable現在不復存在。

-

創建

當您傳遞數據給create方法,你正在做的是通過params散列發送data什麼。這意味着,當Rails的調用create方法 - 它必須通過該變量訪問數據(而不是實例變量)

這就是爲什麼你必須當你在create方法是定義另一個變量:

def create 
    @model = Model.new(model_params) 
end 

所不同的是,現在你有從params散列數據 - 你可以用它來填充相應的ActiveRecord object &保存。