【问题标题】:How to set the Inviter using devise_inevitable gem in rails 4?如何在 rails 4 中使用 devise_inevitable gem 设置邀请者?
【发布时间】:2016-06-08 09:16:32
【问题描述】:

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

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

    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

我通过教师帐户登录,现在想邀请学生,当我点击链接邀请学生时,它会转到路径:“/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

谢谢你的期待。

【问题讨论】:

  • 不应该使用User作为模型,按角色Student, Teachers分隔吗?
  • 教师和学生是独立的模型,而不是用户的角色。
  • 你能粘贴rake routes的输出吗
  • @Ronak Jain 路线已添加到问题描述中。

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


【解决方案1】:

很遗憾,我缺少 7 个声望点来对您的问题发表评论。所以我是这样做的。

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

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

【讨论】:

  • 你的积分怎么没了?教师可以登录查看自己的详细信息,学生也是如此,这就是我们让他们分别登录的原因。如何更改路线?
  • 但是你也有一个用户登录。用户可以做什么?你能给我看看 routes.rb
  • 用户有不同的角色,如超级管理员、管理员等。路由添加在问题描述中。
【解决方案2】:

覆盖应用控制器中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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多