在哪里执行查看记录如果目标是保持控制器亮,请创建?

时间:2011-06-09 19:27:51

标签: ruby-on-rails ruby-on-rails-3

我希望我的应用执行以下操作。

用户A,创建一个房间。然后将用户A添加为A室的成员。这在模型中使用before_save完成,以创建RoomMember记录。

现在我需要帮助的是以下内容:

每当任何其他用户加入会议室时,我希望他们被添加为RoomMember。我的问题是,我在Rails中如何做RoomMember.create?它似乎在控制器中,但我的印象是你不想在控制器中创建记录。那么这应该在哪里生活/工作?

由于

2 个答案:

答案 0 :(得分:2)

控制器是您创建模型的地方。你只是想让他们保持瘦弱而不太了解模特的内部。

如果我接近这个,我会在模型中使用has_many :through模式。我会在Room模型中定义add_attendee。最后,我将有一个单独的AttendeesController来处理创建和销毁与会者(也就是管理房间里的人)。类似的东西:

在User.rb中

    has_many:与会者     has_many:rooms,:through => :与会者

在Room.rb中

has_many :attendees
has_many :users, :through => :attendees

def add_attendee(user_id)
    user_ids << user_id
end

在Attendee.rb

belongs_to :room
belongs_to :user
RoomController.rb中的

def create
   @room = Room.create params[:room]
   @room.add_attendee(current_user.id)
end
AttendeesController.rb中的

def create
    # This adds a person to the room
    @attendee = Attendee.create :user_id => params[:user_id], :room_id => params[:room_id]
end

答案 1 :(得分:0)

顺便说一句:你可能最好不要在before_create而不是before_save为房间的主人做你正在做的事情,这样才能在初始创作时完成房间(不随后更新)。

现在问你的问题......

加入会议室的动作将是用户点击某个链接(可能是POST表单/链接)。你应该将它映射到控制器中的一个动作,它会做这样的事情(我假设它们已经登录,并且你有current_user可用):

def join_room
  @room = Room.find params[:id]
  current_user.join_room @room
end

然后在User#join_room方法中,您可以创建所需的任何记录。