【问题标题】:ActiveRecord::UnknownAttributeError - a missing attribute in a User modelActiveRecord::UnknownAttributeError - 用户模型中缺少的属性
【发布时间】:2017-04-16 20:35:48
【问题描述】:

我是 Ruby on Rails 的新手,我在 rspec 测试中遇到了 UnknownAttributeError。您在哪里以及如何调试此问题?提前致谢。

我已经查看了这些问题,但我的问题不是 -

我正在创建一个登录页面,其中包含名称、密码和密码确认,以及使用 form_for 的提交按钮。

<h1>Welcome!</h1>
<h3>Please log in, stranger.</h3>
<%= form_for @user do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>

  <%= f.label :password %>
  <%= f.text_field :password %>

  <%= f.label :password_confirmation %>
  <%= f.text_field :password_confirmation %>

  <%= f.submit %>
<% end %>

我还有一个 Sessions 控制器,其操作允许在用户登录时创建会话:

class SessionsController < ApplicationController
  def new
  end

  def create
    @user = User.find_by(name: params[:user][:name])
  end
end

这是我的用户控制器,以防万一,这样我就不会遗漏任何东西

class UsersController < ApplicationController
  def new
  end

  def create
    user = User.new(user_params).save
  end

  private

  def user_params
    params.require(:user).permit(:name, :password, :password_confirmation)
  end
end

"name" 是我的用户表中的一个属性。下面是我的架构:

ActiveRecord::Schema.define(version: 20170416184846) do

  create_table "users", force: :cascade do |t|
    t.string   "name"
    t.string   "password_digest"
    t.datetime "created_at",      null: false
    t.datetime "updated_at",      null: false
  end
end

而且我只有一个 ActionController 类方法before_action,它不应该影响未知属性错误。

class User < ActiveRecord::Base
  has_secure_password
end

我还在rails c创建了一条记录,并且成功保存了一条。

2.3.0 :002 > User.create(name: "Dave", password: "dave", password_confirmation: "dave")

(0.1ms) 开始交易 SQL (0.5ms) INSERT INTO "users" ("name", "password_digest", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["name", "Dave"], [" password_digest", "$2a$10$bq9G.od4ecoTRWg0dlwREudjdDX5QFa7L.c1U2Jd6qoKmCnGNG61O"], ["created_at", "2017-04-16 20:41:04.061507"], ["updated_at", "2017-04-16 20:41: 04.061507"]] (0.8ms) 提交事务 => #

最后,这是我的路线:

Rails.application.routes.draw do
  get '/login', to: 'sessions#new'
  post '/login', to: 'sessions#create'
  delete '/logout', to: 'sessions#destroy'
end

这是 SessionsController 的 rspec 文件:

require 'rails_helper'

RSpec.describe SessionsController, type: :controller do

  before do
    User.destroy_all
  end

  let(:connie) {User.create(name: 'Connie', password: 'M4heswaran')}

  describe 'post create' do
    it 'logs you in with the correct password' do
      post :create, user: {name: connie.name, password: connie.password}
      expect(session[:user_id]).to eq(connie.id)
    end

    it 'rejects invalid passwords' do
      post :create, user: {name: connie.name, password: connie.password + 'x'}
      expect(session[:user_id]).to be_nil
    end

    it 'rejects empty passwords' do
      post :create, user: {name: connie.name, password: ''}
      expect(session[:user_id]).to be_nil
    end
  end
end

【问题讨论】:

  • 你在哪里看到@Iceman 的消息?
  • 你能添加整个 session_controller_spec 吗?
  • 当然,我刚刚用 SessionsController @Anton 的规范文件更新了问题
  • 请务必将 connie 放在测试的顶部并查看日志。有有效的对象吗?你为什么不做用户:康妮而不是哈希?
  • 我得到了“connie”,之后我的测试也一样。我实际上运行了bin/rake db:migrate RAILS_ENV=development,这有助于清除未知属性错误!谢谢@Iceman @Anton

标签: ruby-on-rails rspec


【解决方案1】:

您还必须从终端使用此命令设置您的测试数据库

rails db:test:prepare

另一种方法是

RAILS_ENV=test rails db:migrate 

可以在excellent guides阅读更多关于这一切的信息

【讨论】:

    【解决方案2】:

    如果您刚刚开始并且数据库中没有数据从新开始

    删除数据库:

    rake db:drop
    

    创建所有数据库:

    rake db:create
    

    准备你的测试数据库:

    rake db:test:prepare
    

    迁移您的数据库:

    rake db:migrate
    

    然后将您的数据库迁移到测试环境:

    rake db:migrate RAILS_ENV=test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多