2010-03-04 160 views
4

我試圖從一個按鈕的操作中在連接表內創建一條記錄。爲了解釋,我會有一個事件模型,並且想要跟蹤來自每個用戶的選定事件。rails-在連接表中創建記錄

我使用了HABTM關係,因爲我真的不需要任何額外的字段。

User.rb => has_to_and_belongs_to_many:事件 Event.rb => has_to_and_belongs_to_many:用戶 Events_Users遷移=> [USER_ID,事項標識,ID =>假]

所以,我怎麼想我會做到這一點是。 ...

users_controller.rb =>

def add_event 
@user = User.find(session[:user_id]) 
params[:user][:event_ids] ||= [] 
    if @user.update_attributes(params[:user]) 
     flash[:notice]='Added to My Events' 
    redirect_to :action => "index" 
     end 
end 

和btn_link貌似....

<% @events.each do |event| %> 
<%= link_to image_tag("heart.gif"), :controller => 'user', :action => 'add_event' %> 
<%=h event.name %> 
<%=h event.description %> 
<% end %> 

但我不知道如何檢查,看看它的工作......我將如何執行這些操作在控制檯,所以我可以檢查是否記錄被添加?

u = User.find(1) 
e = Event.find(1) 

????? x = u.e.create ?????

回答

5

試試這個:

u = User.find(1) 
u.events << Event.find(1) # will add the Event object to the user events 

u.events.last # will show the event added 
+0

這很好!如何在控制器中添加<<操作,但我可以在網頁上執行操作? – ChrisWesAllen 2010-03-05 22:47:05

+0

'<<'方法也可以在控制器中使用。 'u.event'返回一個數組。基本上你正在調用標準的數組操作。 Rails覆蓋標準行爲或'<<'(也稱爲'push')操作來更新'association'表。 – 2010-03-05 23:00:46

2

但我不知道如何檢查,看看它的工作

您可以在控制檯檢查它,但它並不能證明它會總是工作。它會證明它適用於你的情況。下一次你想測試一個簡單的情況下,你應該再次去控制檯。

INSTEAD: 您應該write tests。例如:

def test_add_events_for_user 
    u = users(:some_user) 
    e1, e2 = events(:one), events(:two) 
    post :add_event, user => {u.id, :event_ids => [e1.id, e2.id] } 
    assert u.events.include?(e1) 
    assert u.events.include?(e2) 
end 

當然,您最好在測試中使用factory_girl + shoulda。

相關問題