我希望我的应用程序执行以下操作。
用户A创建一个房间。然后将用户A添加为Room A的成员。这在模型中使用before_save来创建RoomMember记录。
现在我需要的帮助是:
每当任何其他用户加入Room时,我都希望将他们添加为RoomMember。我的问题是,我在哪里可以在Rails中创建RoomMember.create?它似乎在控制器中,但我觉得你不想在控制器中创建记录。那么,这应该在哪里生活/工作呢?
感谢
控制器是创建模型的地方。你只想让他们瘦下来,不太了解模特的内部结构。
如果我正在处理这个问题,我会在模型中使用has_many :through
模式。我会在房间模型中定义一个add_attendee
。最后,我会有一个单独的AttendeesController来处理创建和销毁与会者(也就是管理会议室中的人员)。类似于:
在User.rb中has_many:与会者has_many:房间,:through=>:与会者
室内
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
室内控制器.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
顺便说一句:你最好在before_create
中为房间的所有者做你已经在做的事情,而不是在before_save
中,这样它只在房间的初始创建时完成(而不是在任何后续更新时)。
现在谈谈你的问题。。。
加入聊天室的操作将是用户点击某个链接(可能是POST表单/链接)。您应该将其映射到控制器中执行类似操作的操作(我假设他们已经登录,并且您有current_user
可用):
def join_room
@room = Room.find params[:id]
current_user.join_room @room
end
然后在User#join_room
方法中,您可以让它创建您需要的任何记录。