实现自定义设备登录和 Actioncable Rails 5
介绍
在本教程中,我们将创建一个使用 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 可以很好地协同工作。
感谢阅读
感谢您阅读本教程。希望您觉得我的方法很容易理解。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!

请先 登录后发表评论 ~