Пользователь с ролью администратора может иметь много отелей, но как администратор может пригласить пользователя только для одного из своих отелей? - PullRequest
0 голосов
/ 30 октября 2019

Контекст Я не могу ухватиться за следующее:

  • Между пользователем и гостиницей существует множество отношений через объединяющуюся таблицу User_Hotel.
  • Пользователь, созданный с помощью devise, имеет роль администратора
  • Пользователь с ролью администратора может создать множество отелей
  • Пользователь с ролью администратора должен иметь возможность приглашать других пользователей в конкретную гостиницу (например,не все его отели). Я использую драгоценный камень, предназначенный для разработки, для отправки приглашений.

Проблемы Я настроил свои маршруты, модели и контроллер для пользователей / приглашений, но что-то не так:

  1. , поскольку мои параметры hotel_id не совпадаютотправлено правильно на мой invitations_controller. См. Сообщение об ошибке: Couldn't find Hotel without an ID. params sent: {"format"=>"109"}
  2. Я не уверен, должен ли / как создать соединения между этим конкретным отелем и приглашенным пользователем?

просмотров / отелей / шоу

<%= link_to "invite new user", new_user_invitation_path(@hotel) %>

маршруты

Rails.application.routes.draw do
  devise_for :users, controllers: {
    invitations: 'users/invitations'
  }

  resources :hotels do
    resources :users
  end
end

модели

class User < ApplicationRecord
  has_many :user_hotels, dependent: :destroy
  has_many :hotels, through: :user_hotels
  enum role: [:owner, :admin, :employee]
  after_initialize :set_default_role, :if => :new_record?

  def set_default_role
    self.role ||= :admin
  end

  devise :invitable, :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :invitable
end

class UserHotel < ApplicationRecord
  belongs_to :hotel
  belongs_to :user
end

class Hotel < ApplicationRecord
  has_many :user_hotels, dependent: :destroy
  has_many :users, through: :user_hotels

  accepts_nested_attributes_for :users, allow_destroy: true, reject_if: ->(attrs) { attrs['email'].blank? || attrs['role'].blank?}
end

контроллеры / пользователи / приглашения

class Users::InvitationsController < Devise::InvitationsController
  def new
    @hotel = Hotel.find(params[:hotel_id])
    @user = User.new
    How to build the join table UserHotel when inviting?
  end
end

1 Ответ

0 голосов
/ 30 октября 2019

IDK, если пользователь, приглашенный в отель, должен принять или нет.

Если необходимо принять:

Вам нужна таблица для хранения приглашений, где вы будетеМагазин user a пригласить на user b на hotel a. Тогда вам нужно inviter_id, invited_id, hotel_id. Когда пользователь принимает приглашение, вы добавляете в промежуточную таблицу запись, касающуюся отеля и пользователя.

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

Если пользователь будет непосредственно добавлен в отель:

Вам нужно всего лишь:

@hotel = Hotel.find(params[:hotel_id])
@user = User.new
@user.hotels << @hotel
...