Использование devise_invitable для добавления пользователей в группу в Ruby on Rails?

У меня есть ресурс «Группы» в моем приложении, к которому могут присоединиться пользователи (группа has_and_belongs_to_many Users и наоборот). Плагин devise_invitable позволяет существующему пользователю моего приложения отправить по электронной почте приглашение другому потенциальному пользователю зарегистрироваться на сайте. , но мне нужны дополнительные функции: я хочу, чтобы пользователь мог пригласить кого-то в определенную группу, чтобы, приняв это приглашение в электронном письме, он мог увидеть ссылку для присоединения эта Группа.

Кто-нибудь использовал devise_invitable, чтобы сделать что-то подобное? Как лучше всего добавить эту дополнительную функциональность? Кажется, мне нужно включить какой-то «токен группы», идентифицирующий группу в электронном письме с приглашением, а затем передать его обратно в URL-адрес, который пользователь щелкает, чтобы принять приглашение.

Должен ли я переопределять методы контроллера приглашений, или есть другой плагин, который лучше подходит для этой цели?


person Tim    schedule 11.11.2010    source источник


Ответы (2)


Я только что реализовал некоторые очень похожие. Я пытался использовать devise_invitable, но это было слишком сложно. Поэтому я искал другие плагины, но ничего не нашел и пришел к выводу, что проще написать собственную реализацию. Вот что я сделал:

  • добавление ресурса приглашения,

  • когда пользователь создает приглашение, я сохраняю в поле приглашения (это сериализованный хеш) всю информацию, которую мне нужно применить к пользователю, который примет приглашение

  • приглашенному пользователю отправляется электронное письмо, содержащее ссылку вида: /users/signup?invitation_token=1231223123

  • когда пользователь нажимает на ссылку, я создаю пользователя и применяю всю информацию, хранящуюся в приглашении, такую ​​как членство в группе, имя, роли...

  • если приглашенному пользователю не нужно регистрироваться в сервисе, то ссылка в письме будет другой: Invitations/123/accept?invitation_token=12312312asdas324

Надеюсь, это поможет

person Matteo Melani    schedule 16.05.2011

Я сделал это, переопределив контроллер приглашений, инструкции по этому поводу находятся на главной странице devise_invitable на github, поэтому я не буду вдаваться в подробности здесь.

В целях безопасности я создал новую таблицу, содержащую дополнительную информацию о приглашении, чтобы ссылка для принятия по электронной почте не содержала ссылку на группу (мои группы создаются только по частным приглашениям, поэтому я не хочу, чтобы приглашенный пользователь изменил URL-адрес приглашения в электронном письме). и, возможно, добавить другие группы, в которые они не были приглашены).

Новая таблица индексируется по идентификатору пользователя после того, как devise_invitable создаст ее в пользовательской таблице.

class Users::InvitesController < Devise::InvitationsController
.
.
def create

    # make sure the current user is connected to this object for security
    if @object.has_connection_with(current_user)

      # perform the invite    
      self.resource = resource_class.invite!(params[resource_name], current_inviter)

      #since we invite based on object, we must reference this object once the user accepts, so we store this in our Invites table
      object_invite = Invite.new(:invitable_type => @object.class.name, :invitable_id => @object.id, :user_id => self.resource.id, :inviter_id => current_inviter.profile.id)
      object_invite.save!

      if resource.errors.empty?
        set_flash_message :notice, :send_instructions, :email => self.resource.email
        #respond_with resource, :location => after_invite_path_for(resource)
        render :json => {:status => 'success'} and return
      else
        respond_with_navigational(resource) { render_with_scope :new }
      end
    end
  end

Затем в вашем методе обновления (опять же в том же контроллере) вы можете найти () запись Invites и получить необходимую информацию, которая позволит вам подключить нового пользователя к группе.

Остался единственный вопрос, как добавить дополнительные параметры в электронное письмо, например, имя группы, которое мне еще предстоит решить.

person Andrew Lank    schedule 04.10.2011