rails4中如何使用devise_inevitablegem设置邀请人?

How to set the Inviter using devise_inevitable gem in rails 4?

我最近正在研究 rails 4 和设置 devise_invitable gem。我有一个学生和教师模型,其中学生被教师邀请意味着教师是邀请者,学生是被邀请者。

我已经在学生 table 中添加了所有必要的列,如下所示:

    t.string   "invitation_token"
    t.datetime "invitation_created_at"
    t.datetime "invitation_sent_at"
    t.datetime "invitation_accepted_at"
    t.integer  "invitation_limit"
    t.integer  "invited_by_id"
    t.string   "invited_by_type"
    t.integer  "invitations_count",      default: 0

我通过教师帐户登录,现在想邀请一名学生,当我点击 link 邀请一名学生时,它会转到路径:“/students/invitation/new”并要求我以以下身份登录一个没有意义的学生,因为我想邀请学生,那么为什么我需要以学生身份登录,即使教师会话已经存在,它应该使用教师对象来邀请学生。

我什至尝试了下面的代码,但它不起作用:

class Teacher < ActiveRecord::Base
     include DeviseInvitable::Inviter
  end

这是我的路线:

                    Prefix Verb   URI Pattern                           Controller#Action
        new_student_session GET    /students/login(.:format)             devise/sessions#new
            student_session POST   /students/login(.:format)             devise/sessions#create
    destroy_student_session DELETE /students/logout(.:format)            devise/sessions#destroy
           student_password POST   /students/password(.:format)          devise/passwords#create
       new_student_password GET    /students/password/new(.:format)      devise/passwords#new
      edit_student_password GET    /students/password/edit(.:format)     devise/passwords#edit
                            PATCH  /students/password(.:format)          devise/passwords#update
                            PUT    /students/password(.:format)          devise/passwords#update
cancel_student_registration GET    /students/cancel(.:format)            devise_invitable/registrations#cancel
       student_registration POST   /students(.:format)                   devise_invitable/registrations#create
   new_student_registration GET    /students/sign_up(.:format)           devise_invitable/registrations#new
  edit_student_registration GET    /students/edit(.:format)              devise_invitable/registrations#edit
                            PATCH  /students(.:format)                   devise_invitable/registrations#update
                            PUT    /students(.:format)                   devise_invitable/registrations#update
                            DELETE /students(.:format)                   devise_invitable/registrations#destroy
  accept_student_invitation GET    /students/invitation/accept(.:format) devise/invitations#edit
  remove_student_invitation GET    /students/invitation/remove(.:format) devise/invitations#destroy
         student_invitation POST   /students/invitation(.:format)        devise/invitations#create
     new_student_invitation GET    /students/invitation/new(.:format)    devise/invitations#new
                            PATCH  /students/invitation(.:format)        devise/invitations#update
                            PUT    /students/invitation(.:format)        devise/invitations#update
        new_teacher_session GET    /teachers/login(.:format)             devise/sessions#new
            teacher_session POST   /teachers/login(.:format)             devise/sessions#create
    destroy_teacher_session DELETE /teachers/logout(.:format)            devise/sessions#destroy
           teacher_password POST   /teachers/password(.:format)          devise/passwords#create
       new_teacher_password GET    /teachers/password/new(.:format)      devise/passwords#new
      edit_teacher_password GET    /teachers/password/edit(.:format)     devise/passwords#edit
                            PATCH  /teachers/password(.:format)          devise/passwords#update
                            PUT    /teachers/password(.:format)          devise/passwords#update
cancel_teacher_registration GET    /teachers/cancel(.:format)            devise_invitable/registrations#cancel
       teacher_registration POST   /teachers(.:format)                   devise_invitable/registrations#create
   new_teacher_registration GET    /teachers/sign_up(.:format)           devise_invitable/registrations#new
  edit_teacher_registration GET    /teachers/edit(.:format)              devise_invitable/registrations#edit
                            PATCH  /teachers(.:format)                   devise_invitable/registrations#update
                            PUT    /teachers(.:format)                   devise_invitable/registrations#update
                            DELETE /teachers(.:format)                   devise_invitable/registrations#destroy
           new_user_session GET    /users/login(.:format)                devise/sessions#new
               user_session POST   /users/login(.:format)                devise/sessions#create
       destroy_user_session DELETE /users/logout(.:format)               devise/sessions#destroy
              user_password POST   /users/password(.:format)             devise/passwords#create
          new_user_password GET    /users/password/new(.:format)         devise/passwords#new
         edit_user_password GET    /users/password/edit(.:format)        devise/passwords#edit
                            PATCH  /users/password(.:format)             devise/passwords#update
                            PUT    /users/password(.:format)             devise/passwords#update
   cancel_user_registration GET    /users/cancel(.:format)               devise_invitable/registrations#cancel
          user_registration POST   /users(.:format)                      devise_invitable/registrations#create
      new_user_registration GET    /users/sign_up(.:format)              devise_invitable/registrations#new
     edit_user_registration GET    /users/edit(.:format)                 devise_invitable/registrations#edit
                            PATCH  /users(.:format)                      devise_invitable/registrations#update
                            PUT    /users(.:format)                      devise_invitable/registrations#update
                            DELETE /users(.:format)                      devise_invitable/registrations#destroy
          static_pages_home GET    /static_pages/home(.:format)          static_pages#home
         dashboard_teachers GET    /teachers/dashboard(.:format)         teachers#dashboard
                       root GET    /                                     static_pages#home

routes.rb

Rails.application.routes.draw do

  devise_for :students, path_names: {sign_in: "login", sign_out: "logout"}
  devise_for :teachers, path_names: {sign_in: "login", sign_out: "logout"}
  devise_for :users, path_names: {sign_in: "login", sign_out: "logout"}
  get 'static_pages/home'

  resources :teachers, only: [] do 
  collection do
    get :dashboard
  end
  end  


   root 'static_pages#home'

end

谢谢你的期待。

不幸的是,我缺少 7 个声望点来 post 对您的问题发表评论。所以我就这样做了。

您有两个用户,1) 学生 2) 老师。为什么有3种登录方式?

无论如何,我猜您希望只有教师能够向学生发送邀请。正如我现在看到的那样,您制定了路线,以便只有学生才能向学生发送邀请那么为什么不更改路线呢?

在应用程序控制器中覆盖 gem 的 authenticate_inviter 方法:

class ApplicationController < ActionController::Base
protected
  def authenticate_inviter!
    authenticate_teacher!(:force => true)
  end
end

并将 DeviseInvitable::Inviter 模块包含到 Teacher 模型中:

class Teacher < ActiveRecord::Base
  devise :database_authenticatable, :validatable
  include DeviseInvitable::Inviter
end

您可以在模型中定义关联,您希望通过该关联发送所有邀请:

class Teacher < ActiveRecord::Base
    has_many :invitations, :class_name => self.to_s, :as => :invited_by
end