上下文 我无法抓住周围的东西:
问题 我为用户/邀请设置了路线,模型和控制器,但是出了点问题:
Couldn't find Hotel without an ID. params sent: {"format"=>"109"}
观看次数/酒店/显示
<%= 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
答案 0 :(得分:0)
被邀请入住酒店的用户是否需要接受IDK。
如果需要接受:
您需要一个表来存储邀请,将user a
到user b
的{{1}}邀请存储在其中。然后,您需要hotel a
,inviter_id
,invited_id
。当用户接受邀请时,您将在与酒店和用户相关的中间表中添加一条记录。
另一种方法是在中间表中添加一个标志来控制哪些被接受和哪些尚未接受,并在关系上添加默认作用域以仅获取被接受。
如果用户将直接添加到酒店:
您只需要执行以下操作:
hotel_id