ruby on rails-如果目标是保持控制器轻,那么在哪里执行View Record Create



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

用户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方法中,您可以让它创建您需要的任何记录。

相关内容

  • 没有找到相关文章

最新更新