我有活动和用户。在活动节目页面上,我想要一个“参加”的按钮。我想获取current_user并为当前事件添加关联,从而使用户“参与”该事件。
我在用户模型中有一个参与事件方法,如下所示:
def attend!(id)
current_user.events << event.find_by_id(id)
end
在#show页面中我有以下表格,但我认为我做得不对:
<%= form_for @event.users.attend(:id) do |f| %>
<div><%= f.hidden_field :id %>
<div class="actions"><%= f.submit "Attend Event" %></div>
<% end %>
我只是不太确定如何进行关联...我已经正确设置了。在控制台中,我这样做并且有效:
@user.events << @event
这会为该用户和用户参加活动的事件添加关联。这是正确设置和工作。我很困惑的是如何在事件视图页面上添加一个按钮。
由于
答案 0 :(得分:2)
应该是(为了简单起见,我省略了css):
<%= form_for Event.new do |f| %>
<%= f.submit "Attend Event" %>
<% end %>
编辑:
由于您希望将当前用户添加到特定事件,因此您可以拥有
<%= button_to 'Attend Event', your_path, :id => .., :method => :post %>
使用@event的id参数。
当用户发布时,您的控制器操作会从params [:id]获取事件ID,获取实际事件以及您的方法与当前用户关联的用户。
第二次编辑:
Your_path指的是命名路由,或者如果您不使用命名路由,请执行以下操作:
:controller => 'users', :action => 'attend'
现在,单击按钮时会执行attend方法。完成后,执行以下操作:
def attend
event = Event.find(params[:id])
current_user.events << event
end
答案 1 :(得分:2)
相反,为SpyrosP的答案添加评论,我只会在我自己的答案中写下:
您应首先创建参加活动的路线:
# in routes.rb
# I assume you have something like this single line below, just add member block with attend
resources :events do
member do
post :attend
end
end
然后在EventsController
创建操作中
dev attend
@event = Event.find(params[:id])
current_user.events << @event
redirect_to @event
end
在您的视图中,您应该创建按钮:
<%= button_to 'Attend Event', attend_event_path(@event.id), :method => :post %>