2013-12-21 78 views
0

所以我有四個數據庫表。 (:name,:description,:user_id etc ..),Scrapbooks(:name,:description,:user_id)和Scrapbook_Entry(:user_id,recipe_id,:scrapbook_id)在Rails中添加到連接表

我可以填寫用戶,食譜和Scrapbooks表格,但我現在想要做的是有一個選項可以將配方保存到剪貼簿中。通過這樣做,我需要填充我爲其創建模型的Scrapbook_Entry表。

Scrapbook_Entry型號:

has_one :recipe 
has_one :scrapbook 

配方型號:

has_many :scrapbooks, through: :scrapbook_entries 

剪貼簿模型

has_many :recipes, through: :scrapbook_entries 

用戶模型

has_many :recipes, dependent: :destroy 
has_many :scrapbooks, dependent: :destroy 

我想在配方視圖中創建一個表單,以允許我選擇一個剪貼簿來保存配方,然後提交併填充Scrapbook_Entry表。

我的問題是:我需要爲我的scrapbook_entries創建一個新的控制器,並且已在一個創造方法或我將能夠使用配方控制器如果是這樣,怎麼會這樣?

我是新來的鐵軌,所以仍然試圖找出全部。謝謝!

+0

您沒有真正告訴我們您是否遇到問題。只有你有什麼和你想做什麼。 –

+0

道歉!這更具體一點嗎?添加了一個編輯。 – MikeHolford

回答

0

你不需要一個新的控制器。你應該能夠沿着

@recipe.scrapbook_entries.build(scrapbook: @scrapbook) 

假設你有一個@recipe變量與它Recipe對象,並與它Scrapbook對象@scrapbook變量線做一些事情。

+0

非常感謝,我給它去了 – MikeHolford

+0

這會被放在配方控制器的創建方法? – MikeHolford

+0

如果您在創建配方時立即鏈接配方,是的。但是,它不一定非得。 –

0

這聽起來像accepts_nested_attributes_for

它的工作方式工作是,它需要一個「嵌套模式」(在你的情況,ScrapBookEntry),並允許您直接從父模型將數據發送給它( Recipe)。它有一個學習曲線,但進來非常有用,尤其是當你開始處理大量的模塊化數據


接受嵌套屬性

有一個great RailsCast on this subject here

enter image description here

它的工作原理是通過父模型的控制器爲嵌套模型構建一個ActiveRecord對象,從而允許Rails將兩個對象該表格已提交。這意味着,只要你想你的嵌套模式,同時保持你的代碼效率


代碼

而不是創建一個新的控制器,你可以添加儘可能多的數據,你應該能夠處理所有的在您的Recipes控制器中進行處理,如下所示:

#app/models/recipe.rb 
Class Recipe < ActiveRecord::Base 
    accepts_nested_attributes_for :scrapbook_entries 
end 

#app/controllers/recipes_controller.rb 
def new 
    @recipe = Recipe.new 
    @recipe.scrapbook_entries.build #-> repeat for number of fields you want 
end 

def create 
    @recipe = Recipe.new(recipe_params) 
    @recipe.save 
end 

private 
def recipe_params 
    params.require(:recipe).permit(:recipe, :params, scrapbook_entries_attributes: [:extra, :data, :you, :want, :to, :save]) 
end 

#app/views/recipes/new.html.erb 
<%= form_for @recipe do |f| %> 
    <%= f.text_field :example_field %> 
    <%= f.fields_for :scrapbook_entries do |s| %> 
     <%= f.text_field :extra_data %> 
    <% end %> 
<% end %> 
+0

謝謝你所有這些信息豐富。如果配方和剪貼簿數據已經存在,這仍然可以工作嗎?我只是想用表單來填充現有數據的Scrapbook_entry表格? – MikeHolford

+0

當然 - 我們使用類似的東西。我們有一個通訊應用程序,您可以在其中創建新消息並添加訂閱者。 subs_have_已經存在了,我們只是使用'select'表單元素來挑選它們 –

+0

這很好,因爲我建議的方式只是將數據發送到連接模型。我們很難研究如何通過連接模型創建新元素,並且如果你想要這樣做,你必須在連接中嵌入另一個'accep_nested_attributes_for' –