2010-08-18 60 views
0

以這篇文章爲出發點的代理:建築協會通過

Rails Way Blog - Association Proxies

,特別在

def create 
    @todo_list = current_user.todo_lists.build params[:todo_list] 
    if @todo_list.save 
    redirect_to todo_list_url(@todo_list) 
    else 
    render :action=>'new' 
    end 
end 

這看是確保你將所有權分配給用戶

的方式

但是假設ToDo列表是一個多關係的關聯通過即

def User < AR:Base 
    has_many :user_todos 
    has_many :todo_lists, :through => :user_todos 
end 

在這一點上的has_many ......

@todo_list = current_user.todo_lists.build params[:todo_list] 

仍然有效,但只有todo_list被保存,而不是加入。如何在沒有嵌套if/else的情況下獲得聯合代理的喜悅?如果聯接或Todo實例未保存,則無法驗證。

我在想沿着線的東西...

@todo_list = cu.user_todos.build.build_to_do(params[:todo_list]) 

,但正如我在user_todos上面提到的沒有得到保存。

非常感謝您的幫助!

Kevin。

+0

你在說'User#todo_lists'和'User#todos',但這些是你調整結構後的兩個不同的東西。重命名應該會破壞一切。 – tadman 2010-08-18 13:47:53

+0

啊,我會改變這一點。它仍然不會保存連接! :) – 2010-08-18 14:12:34

回答

0

我得到它的工作...

起初我:

@todo_list = @user.todo_lists.build params[:todo_list] 
@todo_list.save! 

這工作時TodoList的簡單belongs_to的用戶,但而不是當它是多對多的關係時。當我改變了我不得不做的...

@todo_list = @user.todo_lists.build params[:todo_list] 
@user.save! 

這保存了@user,join和@todo_list。

明顯的,我想,但後來我想,如果最初的例子應該也

current_user.save! 

,而不是

@todo_list.save! 

我想後面構建的想法是,它驗證並保存關聯時你保存父母,那麼Rails Way的例子會錯過這一點嗎?或更可能是我?

0

嘗試做線沿線的東西:

current_user.todo_lists << TodoList.new(params[:todo_list]) 
+0

謝謝馬特。我從來沒有真正理解過構建和你在這裏所做的事情之間的區別。不知道這是否是一個好的答案!:)但感謝讓我看着它不同。 – 2010-08-19 08:58:55

+0

再想一想 - 我猜build可以讓你將新的ToDoList實例分配給一行中的變量。無需做: @todo_list = ToDoList.new(params [:todo_list]) current_user.todo_lists << @todo_list – 2010-08-19 09:10:55