巫术使用用户名简单登录

Sorcery Simple Login with username

我在用 RoR 编写的博客网站上工作,但遇到了 Sorcery 的问题。我从他们的文档中做了教程来创建简单的登录。我的问题是,他们在登录时使用电子邮件来识别用户。

所以我尝试修改我的会话控制器以将用户名作为参数而不是电子邮件发送,并相应地修改了我的视图。

日志显示一切正常,用户名和密码已传递到数据库。但是,我找不到解决方案,生成的 SQL 字符串仍然使用 "authors"."email" 作为参数。

我该如何解决?

我的日志:

Processing by AuthorSessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"ForXjJMiPCI6H37xqtPzGwa9XBOHx1yIaGjlZdUd6Iw+G4M5v6s/JXrFcGG5VVyuFl6Is+cr5Zp/fxJcNyS/Tw==", "username"=>"Test", "password"=>"[FILTERED]", "commit"=>"Login"}
Author Load (0.5ms)  SELECT  "authors".* FROM "authors" WHERE "authors"."email" = 'Test' ORDER BY "authors"."id" ASC LIMIT ?  [["LIMIT", 1]]
Rendering author_sessions/new.html.erb within layouts/application
Rendered author_sessions/new.html.erb within layouts/application (2.4ms)
Completed 200 OK in 63ms (Views: 49.6ms | ActiveRecord: 2.5ms)

我的会话控制器:

class AuthorSessionsController < ApplicationController
  def new
  end

  def create
    if login(params[:username], params[:password])
      redirect_back_or_to(articles_path, notice: 'Logged in successfully.')
    else
      flash.alert = 'Login failed.'
      render action: :new
    end
  end

  def destroy
    logout
    redirect_to(articles_path, notice: 'Logged out!')
  end
end

我的new.html.erb

<h1>Login</h1>

<%= form_tag author_sessions_path, method: :post do %>
<div class="field">
  <%= label_tag :username %>
  <%= text_field_tag :username %>
  <br>
</div>
<div class="field">
  <%= label_tag :password %>
  <%= password_field_tag :password %>
  <br>
</div>
<div class="actions">
  <%= submit_tag 'Login' %>
</div>
<% end %>

<%= link_to 'Back', articles_path %>

我确实遇到了同样的问题,以下帮助: - 在迁移文件中安装 sorcery (rails g sorcery:install) 时,将 :email 更改为 :username,使其看起来像这样

    class SorceryCore < ActiveRecord::Migration[5.0]
      def change
        create_table :users do |t|
          t.string :username,            :null => false
          t.string :crypted_password
          t.string :salt

          t.timestamps                :null => false
        end

        add_index :users, :username, unique: true
      end
    end
  • 然后 rake db:migrate 所以我有一个用户模型
  • 我看到你已经制作了 users_sessions,所以让我们跳过 rails generate controller UserSessions new create destroy 并填充视图部分
  • 在我的 users_sessions_controller.rb 文件中,我还调用了 login(params[:username], params[:password]),这是一种魔法方法,默认情况下它采用 :email 作为 username_attribute
  • 为了将其更改为 :username,我转到 /config/initializers/sorcery.rb 并找到 config.user_config do |user| 行(大约第 188 行),并向其中添加了 user.username_attribute_names = [:username],所以而不是电子邮件,它将使用用户名。

这为我解决了。不要忘记将 :email 更改为 :username 在任何你使用它的地方。