В нашем Rails 4 приложения, есть четыре модели:Приложение Rails 4: как разрешить пользователям приглашать других пользователей для совместной работы на конкретном экземпляре модели?
class User < ActiveRecord::Base
has_many :administrations, dependent: :destroy
has_many :calendars, through: :administrations
end
class Administration < ActiveRecord::Base
belongs_to :user
belongs_to :calendar
end
class Calendar < ActiveRecord::Base
has_many :administrations, dependent: :destroy
has_many :users, through: :administrations
has_many :posts, dependent: :destroy
end
class Post < ActiveRecord::Base
belongs_to :calendar
end
Здесь находятся соответствующие миграции:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :first_name
t.string :last_name
t.string :email
t.integer :total_calendar_count
t.integer :owned_calendar_count
t.timestamps null: false
end
end
end
class CreateAdministrations < ActiveRecord::Migration
def change
create_table :administrations do |t|
t.references :user, index: true, foreign_key: true
t.references :calendar, index: true, foreign_key: true
t.string :role
t.timestamps null: false
end
end
end
class CreateCalendars < ActiveRecord::Migration
def change
create_table :calendars do |t|
t.string :name
t.timestamps null: false
end
end
end
class CreatePosts < ActiveRecord::Migration
def change
create_table :posts do |t|
t.references :calendar, index: true, foreign_key: true
t.date :date
t.time :time
t.string :focus
t.string :format
t.string :blog_title
t.text :long_copy
t.text :short_copy
t.string :link
t.string :hashtag
t.string :media
t.float :promotion
t.string :target
t.integer :approval
t.text :comment
t.timestamps null: false
end
end
end
Так в основном, user
может иметь много calendar
и calendar
может иметь много user
.
Когда @user
создает новый @calendar
, мы сгенерируем новый @administration
: это в настоящее время работает.
Теперь мы хотим, чтобы @user
приглашал других @user
- уже зарегистрированных или нет - присоединиться к существующему @calendar
.
Это создаст новый @administration
между приглашенными @user
и существующим @calendar
.
Хитрая часть здесь - или, по крайней мере, размыто часть для нас - вроде бы обрабатывать как зарегистрированные, так и незарегистрированные пользователи:
Для незарегистрированных пользователей: когда «приглашает»
user
акций вcalendar
с «приглашен»user
, как мы разрешаем последнему получать приглашение через адрес электронной почты, введенный первым, позволяя ему регистрироваться в приложении через адрес электронной почты по своему выбору (либо тот же, либо другой)?Для зарегистрированных пользователей: если «приглашает»
user
акций вcalendar
с «приглашены»user
, как мы позволяем последним, чтобы получить приглашение через адрес электронной почты, набранного в на прежний, позволяя ему либо войдите в приложение со своей существующей учетной записью (либо с тем же адресом, либо с другим адресом электронной почты, чем тот, который используется «приглашением»user
) или зарегистрируйтесь с адресом электронной почты по его выбору (либо тот, который используется «приглашением»user
или другой адрес)?
Самое главное, как мы упорствовать информацию, относящуюся к calendar
(скажем calendar_id
), так что, как только «пригласил» user
имеет либо войти в систему или подписался, он имеет доступ к calendar
в " приглашающий "пользователь хотел предоставить ему доступ?
Примечание: Мы в настоящее время с помощью пользовательской системы аутентификации/авторизации, как предложено в Michael Hartl's Rails Tutorial и не используют Devise
или другой драгоценный камень по этому вопросу.
Теперь вопрос в том, как достичь этого:
- Если мы просто создаем
invite
метод вAdministration
модели и использовать его вAdministrationsController#new
? - Должны ли мы создать совершенно новое
InvitationsController
? - Следует ли использовать драгоценный камень, например Devise Invitable *?
- Или есть совершенно другое, очевидное решение, которое нам не хватает?
Используете ли вы какие-либо авторизации? Нужно ли приглашать пользователя в приложение? –
Как указано в * Примечание *, мы используем систему аутентификации: «В настоящее время мы используем специальную систему аутентификации/авторизации, как это предложено в учебнике Rails Майкла Хартла и не используют Devise или другой камень в этом отношении». И да, пользователь должен пригласить другого пользователя из приложения. Но здесь это не «вирусный» механизм приглашений, который мы пытаемся реализовать: приглашение позволяет пользователям сотрудничать в одном экземпляре '@ calendar', если это имеет смысл. –