2010-03-04 121 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。

相关问题