Ruby on Rails: Devise: Как добавить «пригласить пользователя в модель»? - PullRequest
2 голосов
/ 10 сентября 2011

У меня есть модель Group, в которой много членов (User модели).

class Group < ActiveRecord::Base
    belongs_to :owner, :class_name => 'User'
    has_many :members, :through => :group_members, :class_name => 'User'
end

Модель User использует Devise. Мне нужно добавить возможность для пользователя (владельца группы) «пригласить» другого пользователя (который может иметь, а может и не иметь запись пользователя) в группу. Как мне это сделать? Что-то подобное уже было построено и упаковано как драгоценный камень?

1 Ответ

3 голосов
/ 11 сентября 2011

Ну, первое действие будет найти пользователя, а затем добавить его в группу, в которой он существует.Если он не существует, сделайте что-то вроде отправки приглашения по электронной почте и поместите его в отдельную таблицу, также принадлежащую группе.Затем, если кто-то с тем же адресом электронной почты зарегистрируется, поместите нового пользователя непосредственно в группу.Итого: добавьте новую модель с именем, например «Invite_user», которая имеет только строку адреса электронной почты и принадлежит к групповой модели.

class InvitedUser < ActiveRecord:Base
   belongs_to :group
end

Создайте действие приглашения следующим образом:

def invite_user
   user = User.find_by_email(params[:email])
   group = Group.find(params[:id])
   if user
     group.users << user
   else
     send_invite user.email
     group.invited_users << user
   end
 end

И, наконец, вам нужно создать подкласс контроллера регистрации Devise, чтобы вы могли переопределить / добавить действие по умолчанию после успешной регистрации.Однако эта часть может быть ненадежной, поскольку я частично полагаюсь на документацию Devise и не пробовал сам:

class RegistrationsController < Devise::RegistrationsController

  protected

  def def after_sign_up_path_for(resource)
    invited_user = InvitedUser.find_by_email(resource.email)
    if invited_user
      invited_user.group.users << resource
      invited_user.destroy
    end
    after_sign_in_path_for(resource)
  end
end

или что-то в этом роде.И вам все еще нужно реализовать действие send_invite, конечно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...