使用collections_select在一个带有accepts_nested_attributes_for的表单中生成多对多关系

时间:2011-06-12 09:03:20

标签: ruby-on-rails

新的rails开发人员试图了解我对活动记录关联的看法。

我正在构建一个事件安排应用程序,正在处理邀请功能。我已经有一个基本的when / where事件创建表单,我现在想让事件创建者从网站上创建者的朋友列表中生成一个被邀请参加活动的用户列表(朋友通过以下方式记录)一个反身的has_many:通过用户模型上的友谊关系)。我已经建立了一个has_many:通过邀请模型来表示事件和用户(被邀请者)之间的多对多关系。各个模型看起来像这样:

User.rb

class User < ActiveRecord::Base

      has_many :friendships
      has_many :friends, :through => :friendships

      attr_accessor :password
      attr_accessible :first_name, :middle_name, :last_name, :email,:password, :password_confirmation

      has_many :events

      has_many :invitations, :foreign_key => :invitee_id
      has_many :inviting_events, :through => :invitations, :source => :event

end

Event.rb

class Event < ActiveRecord::Base

  attr_accessible :title, :description, :location, :time_start, :time_end, :event_access_type

  belongs_to :user

  has_many :invitations
  has_many :invitees, :through => :invitations

  accepts_nested_attributes_for :invitations

end

Friendship.rb

class Friendship < ActiveRecord::Base

  belongs_to :user
  belongs_to :friend, :class_name => "User"

end

Invitation.rb

class Invitation < ActiveRecord::Base

  belongs_to :event
  belongs_to :invitee, :class_name => "User"

end

我正在尝试使用该表单生成一个下拉列表,其中启用了多个选项(我知道可怕的UI,但这仅用于测试和原型设计),其中填充了当前用户在网站上的朋友。为此,我目前正在使用此表单辅助方法:

<%= collection_select(:friendship, :friend_id, current_user.friendships , :friend_id, :friends_name, {}, html_options = {:multiple => true}) %>

这会生成一个下拉列表,我想提交活动创建者想要邀请的用户的friend_ids(即user_ids)。我的下一步是在提交时进行这些选择,并使用每个friend_id值,然后在创建的事件和朋友之间生成新的邀请关联。我的理解是,由于这是一个多模型表单,我需要在事件模型中包含“accepts_nested_attributes_for:invitations”。我的基本问题是我不清楚表单和控制器语法应该是什么来获取提交的下拉值并使用它们来生成新的邀请对象。以下是我在表单视图中的最新尝试:

_event.form.html.erb

<%= form_for(@event) do |f| %>
  <%= render 'shared/error_messages', :object => f.object %>
  <div class="field">
    <%= f.label :title %><br />
    <%= f.text_field :title %>
  </div>
  <div class="field">
    <%= f.label :description %><br />
    <%= f.text_area :description %>
  </div>
  <div class="field">
    <%= f.label :location %><br />
    <%= f.text_field :location %>
  </div>
    <% f.fields_for :invitation do |invitation_form| %>
        <div class="field">
            <%= invitation_form.label "Who's invited?" %><br />
            <%= collection_select(:friendship, :friend_id, current_user.friendships , :friend_id, :friends_name, {}, html_options = {:multiple => true}) %>
        </div>
    <% end %>
  <div class="actions">
    <%= f.submit "Submit" %>
  </div>
<% end %>

如果有人可以提供关于如何做到这一点的指导,以及我在使用的关系或形式方法方面是否犯了任何错误,那将非常感激。

谢谢!

0 个答案:

没有答案