如何在视图中添加模型之间的关联

时间:2011-06-06 05:16:23

标签: ruby-on-rails

我有活动和用户。在活动节目页面上,我想要一个“参加”的按钮。我想获取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

这会为该用户和用户参加活动的事件添加关联。这是正确设置和工作。我很困惑的是如何在事件视图页面上添加一个按钮。

由于

2 个答案:

答案 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 %>