实现自定义设备登录和 Actioncable Rails 5

发布日期:2026-06-25 05:54:06   来源 : 杭州电子商务研究院    浏览量 :26
杭州电子商务研究院 发布日期:2026-06-25 05:54:06  
26

介绍

在本教程中,我们将创建一个使用 ActionCable 自定义 Devise 登录页面的 Rails 5 应用程序!这个应用程序如此独特的原因在于,我们希望在连接通道中将订阅用户定义为登录的current_user。我将引导您完成完成此挑战的步骤。

Devise 和 ActionCable 相结合,让我们能够跟踪用户的行为,特别是在游戏设置中。这可以让我们稍后创建游戏大厅,查看用户过去的得分,并确定谁是排行榜上的第一名。

安装

让我们开始吧。

首先确保你的 Rails 是最新的。使用:rails -v并确保输出与以下内容匹配:Rails 5.0.0.rc1

拥有最新版本的 Rails 后,创建一个新的 Rails 5 应用程序:

      rails new <Your App Name>
    

接下来包含 Devise Gem 文件:

      gem 'devise'
    

捆:

      bundle install
    

接下来安装 Devise 基础知识以及 Devise Views:

      rails generate devise:install && rails generate devise:views
    

现在是时候用 Devise 创建用户模型了

      rails generate devise <Your Model Name, Usually Just: user>
    

最后我们需要迁移并回滚我们的 Devise 表:

      rake db:migrate && rake db:rollback && rake db:migrate
    

恭喜!您已成功创建 Devise 模型。

应用

但现在我们想添加自定义登录名,例如 studentID 而不是电子邮件。在本例中,我们将使用:studentid

我们首先要向用户模型添加身份验证,以便我们可以通过添加:authentication_keys允许studentid作为用户登录的验证

      class User < ApplicationRecord

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  validates :studentid, numericality: { only_integer: true}, presence: true, length: { is: 6 }

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:studentid]
end
    

接下来我们将进入 ApplicationController 以允许登录时输入 studentid,以及其他设备属性:

      class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def after_sign_in_path_for(users)
    grid_index_path
  end


  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit(:studentid, :email, :password, :password_confirmation, :remember_me) }
    devise_parameter_sanitizer.permit(:sign_in) { |u| u.permit(:studentid, :password, :remember_me) }
    devise_parameter_sanitizer.permit(:account_update) { |u| u.permit( :studentid, :email, :password, :password_confirmation, :current_password) }
  end

end
    

def after_sign_in_path_for(users)允许您在用户登录后将其重定向到您的主页。在本例中,我的主页是:grid_index_path

我们现在需要将其包含在我们的routes.rb文件中。

      Rails.application.routes.draw do
  devise_for :users, controllers: { registrations: "registrations"}
  as :user do
    get '/' => 'devise/registrations#new'
  end
  mount ActionCable.server => "/cable"
  resources :grid
end
    

在这里我们将指定,当用户访问我们的网站时,将通过'devise/registrations#new'创建一个新帐户。您也可以通过更改路线将他们发送到其他地方。现在请忽略 Action Cable Mount,但我们稍后会需要它!

接下来我们将进入 Devise 的视图来添加我们的自定义登录。

首先,更改views/devise/registrations中的new.html.erb文件,为我们的新自定义登录添加一个字段:

      <div class="field">
    <%= f.label :studentid, 'Colorado College ID' %><br />
    <%= f.text_field :studentid, autofocus: true %>
  </div>
    

完整文件现在如下所示:

      <h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <div class="field">
    <%= f.label :studentid, 'Colorado College ID' %><br />
    <%= f.text_field :studentid, autofocus: true %>
  </div>
  <br>
  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email%>
  </div>
  <br>
  <div class="field">
    <%= f.label :password %>
    <% if @minimum_password_length %>
    <em>(<%= @minimum_password_length %> characters minimum)</em>
    <% end %><br />
    <%= f.password_field :password, autocomplete: "off" %>
  </div>
  <br>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "off" %>
  </div>
  <br>
  <div class="actions">
    <%= f.submit "Sign up" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>
    

我们现在还需要更改views/devise/sessions中的new.html.erb文件

      <h2>Log in</h2>

<%= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f| %>
  <div class="field">
    <%= f.label :studentid, 'Colorado College ID' %><br />
    <%= f.text_field :studentid, autofocus: true %>
  </div>

  <div class="field">
    <%= f.label :password %><br />
    <%= f.password_field :password, autocomplete: "off" %>
  </div>

  <% if devise_mapping.rememberable? -%>
    <div class="field">
      <%= f.check_box :remember_me %>
      <%= f.label :remember_me %>
    </div>
  <% end -%>

  <div class="actions">
    <%= f.submit "Log in" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>
    

现在是时候将其添加到我们的表中并重新迁移了:

      class DeviseCreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.integer :studentid,  null: false
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.inet     :current_sign_in_ip
      t.inet     :last_sign_in_ip



      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end
    

您可以根据需要在此处添加验证。我建议添加唯一验证,以便多个用户不能拥有相同的 ID 或用户名(在其他情况下)。

现在再次迁移:rake db:migrate

太棒了!我们已自定义登录选项并启用登录。现在,如果用户已通过 Devise 登录,我们将设置订阅连接。

首先,通过查看文件夹app/channels来确保您拥有 ActionCable 。之后,通过更新文件app/channels/connection.rb来定义订阅

      module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user

    def connect
      self.current_user = find_verified_user
      logger.add_tags 'ActionCable', current_user.studentid
    end

    protected

    def find_verified_user # this checks whether a user is authenticated with devise
      if verified_user = env['warden'].user
        verified_user
      else
        reject_unauthorized_connection
      end
    end
  end
end
    

这将允许您检查页面上的当前用户并验证用户是否已登录。如果已登录,则用户成为有效订户。显然,在身份验证和用户跟踪方面,Devise 和 ActionCable 可以很好地协同工作。

感谢阅读

感谢您阅读本教程。希望您觉得我的方法很容易理解。

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据