我是Ruby on Rails的新手,我通过我的rspec测试遇到了UnknownAttributeError。您在何处以及如何调试此问题?提前谢谢。
我已经查看了这些问题,但我的问题不是 -
heroku - 我没有使用kerokuapp https://stackoverflow.com/questions/8139578/activerecordunknownattributeerror
故障:
1)SessionsController post post使用正确的密码登录 失败/错误:让(:connie){User.create(名称:'Connie',密码:'M4heswaran')} ActiveRecord的:: 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”是我的users表中的一个属性。以下是我的架构:
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)提交事务 =&GT; #
最后,这是我的路线:
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
答案 0 :(得分:2)
您还必须使用终端
中的此命令设置测试数据库rails db:test:prepare
另一种方式是
rails db:migrate RAILS_ENV=test
中详细了解这一切
答案 1 :(得分:0)
如果您刚刚开始,数据库中没有数据从新的
开始删除数据库:
rake db:drop
创建所有数据库:
rake db:create
准备测试数据库:
rake db:test:prepare
迁移你的数据库:
rake db:migrate
然后迁移db for test env:
rake db:migrate RAILS_ENV=test