我正在尝试测试我的 Controller 。当我运行测试时,在“should edit user”中,出现此错误。
1) 错误: 用户 Controller 测试#test_should_edit_user: ActionView::Template::Error:表单中的第一个参数不能包含 nil 或为空
我想知道如何解决这个错误
user_controller_test
test "should edit user" do
get :edit, id: @user
assert_response :sucess
end
用户 Controller
class UsersController < ApplicationController
def index
@users = User.all
end
def create
@user = User.new(user_params)
if @user.password == @user.password_confirmation
if @user.save
upload params[:user][:document]
redirect_to root_path
else
render "new"
end
else
render "new"
end
end
def new
@user = User.new
end
def edit
@user = User.find_by_id(session[:remember_token])
end
def edit_password
@user = User.find_by_id(session[:remember_token])
end
def update
@user = User.find_by_id(session[:remember_token])
if @user
@user.update_attribute(:username, params[:user][:username])
@user.update_attribute(:email, params[:user][:email])
redirect_to root_path
else
render "edit"
end
end
def updatePassword
@userSession = User.find_by_id(session[:remember_token])
@user = User.authenticate(@userSession.username, params[:user][:password])
if @user
if params[:user][:password_confirmation] == params[:user][:new_password]
if @user.update_attribute(:password, params[:user][:new_password])
redirect_to root_path
else
redirect_to edit_password_path
end
else
redirect_to edit_password_path
end
else
redirect_to edit_password_path
end
end
def desactivate
@user = User.find_by_id(session[:remember_token])
if @user
@user.update_attribute(:account_status, false)
redirect_to log_out_path
else
redirect_to root_path
end
end
def destroy
@user = User.find(params[:id])
@user.destroy
redirect_to(action: "index")
end
和edit.html.erb
<%= link_to "Desativar conta", desactivate_account_path %>
<%= link_to "Alterar Senha", edit_password_path, class: 'button' %>
<%= form_for @user do |f| %>
<% if @user.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@user.errors.count, "error") %> prohibited this user from being saved:</h2>
<ul>
<% @user.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :username %><br>
<%= f.text_field :username %>
</div>
<div class="field">
<%= f.label :email %><br>
<%= f.text_field :email %>
</div>
<div class="actions">
<%= f.submit 'Salvar alteração' %>
</div>
<% end %>
最佳答案
有两件事:
首先,为了让您的代码完全按原样工作,请尝试以下操作:
test "should edit user" do
session[:remember_token] = @user.id
get :edit
assert_response :success
end
注意 success 的拼写,两个“c”
那是因为在您运行测试时没有 session
。
这带来了第二件事:您在哪里初始化 session
哈希?您应该在其中一个 Controller 中的某处有类似 session = params[:user]
的内容。
关于ruby-on-rails - 在 rails 中测试 - 表单中的第一个参数不能包含 nil 或为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26259046/