我希望我的应用执行以下操作。
用户A,创建一个房间。然后将用户A添加为A室的成员。这在模型中使用before_save完成,以创建RoomMember记录。
现在我需要帮助的是以下内容:
每当任何其他用户加入会议室时,我希望他们被添加为RoomMember。我的问题是,我在Rails中如何做RoomMember.create?它似乎在控制器中,但我的印象是你不想在控制器中创建记录。那么这应该在哪里生活/工作?
由于
答案 0 :(得分:2)
控制器是您创建模型的地方。你只是想让他们保持瘦弱而不太了解模特的内部。
如果我接近这个,我会在模型中使用has_many :through
模式。我会在Room模型中定义add_attendee
。最后,我将有一个单独的AttendeesController来处理创建和销毁与会者(也就是管理房间里的人)。类似的东西:
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
方法中,您可以创建所需的任何记录。