2010-11-11 2 views
8

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

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

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

ответ

7

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

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

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

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

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

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

Надеется, что это поможет

6

Я сделал это, перекрывая контроллер пРИГЛАШАЕТ, инструкции сделать это находятся в 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 

Затем в методе обновления (снова в том же контроллере) можно найти() запись ПРИГЛАШАЕТ и потянуть необходимую информацию, которая позволит вам подключить нового пользователя к группе.

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

+0

отлично, спасибо – overlox