Эта ссылка имеет очень сложную реализацию групп пользователей и членства.Он даже показывает, как использовать потрясающий гем Workflow для реализации конечного автомата для отслеживания процесса присоединения к группе.Честно говоря, я сомневаюсь, что вы получите гораздо лучший ответ.Я предлагаю вам просто взять код в сообщении блога в качестве отправной точки и внести изменения в соответствии с вашими потребностями.
Единственное, чего не хватает, - это приглашения.Я бы оставил это простым и просто добавил invitation_token
столбец к Group
.Когда приглашение отправляется, токен используется для генерации хэша SHA-1, который может быть частью ссылки, отправленной приглашенному пользователю.Когда ссылка нажата, контроллер может проверить, является ли код приглашения действительным, и добавить пользователя в группу.
Вот небольшой пример кода, чтобы дать представление о реализации.Я уверен, что есть много возможностей для улучшения, но надеюсь, что это даст вам направление:
# in your Group model
def redeem_token(some_code, invitee_name)
invitation_token == decode_invitation_code(some_code, invitee_name)
end
def decode_invitation_code(encrypted, salt)
# use EzCrypto or something similar : http://ezcrypto.rubyforge.org/
# use the invitation_token as the password
# and the invitee name as the salt
EzCrypto::Key.decrypt_with_password invitation_token, salt, encrypted
end
def generate_invitation_for(user)
# use invitee name as salt
# and invitation_token as both password and content
EzCrypto::Key.encrypt_with_password invitation_token,
user.name,
invitation_token
end
# in your routes.rb do something like
resources :groups do
member do
get 'invitation/:invitation_token', :action => :invitation
end
# ...
end
# in your groups_controller.rb
def invitation
@group = Group.find(:id)
if @group.redeem_token(params[:invitation_token], current_user.name)
@group.add_member(current_user)
redirect_to root_path, :alert => "You were added to the group!"
else
redirect_to root_path, :alert => Invitation code not valid!"
end
end
Надеюсь, вы найдете это полезным.