拥有管理员角色的用户可以拥有许多酒店,但是管理员如何邀请用户仅入住其中一家酒店?

时间:2019-10-30 08:34:11

标签: ruby-on-rails devise devise-invitable

上下文 我无法抓住周围的东西:

  • 通过联接表User_Hotel,用户和酒店之间存在多对多关系。
  • 使用devise创建的用户具有管理员角色
  • 具有管理员角色的用户可以创建许多酒店
  • 具有管理员角色的用户应该可以邀请其他用户访问特定的酒店(例如,不是其所有酒店)。我正在使用可邀请设计的gem发送邀请。

问题 我为用户/邀请设置了路线,模型和控制器,但是出了点问题:

  1. 因为我的hotel_id参数没有正确发送到我的Invitations_controller。查看错误消息: Couldn't find Hotel without an ID. params sent: {"format"=>"109"}
  2. 我不确定是否/如何在受邀请的特定酒店en用户之间建立联系?

观看次数/酒店/显示

<%= 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 :(得分:0)

被邀请入住酒店的用户是否需要接受IDK。

如果需要接受:

您需要一个表来存储邀请,将user auser b的{​​{1}}邀请存储在其中。然后,您需要hotel ainviter_idinvited_id。当用户接受邀请时,您将在与酒店和用户相关的中间表中添加一条记录。

另一种方法是在中间表中添加一个标志来控制哪些被接受和哪些尚未接受,并在关系上添加默认作用域以仅获取被接受。

如果用户将直接添加到酒店:

您只需要执行以下操作:

hotel_id