ruby-on-rails - 在 rails 中测试 - 表单中的第一个参数不能包含 nil 或为空

标签 ruby-on-rails ruby testing

我正在尝试测试我的 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/

相关文章:

ruby-on-rails - 有没有办法在没有 mod_rewrite 的情况下使用 Ruby on Rails 将 www.foo.com/* 重定向到 foo.com/*

ruby - 如何用gets设置多个变量

ruby-on-rails - Rails db :migrate aborting. ..不知道为什么或如何修复它

c# - 如何在我上传文件的 Asp.Net 核心 Web API 端点上进行集成测试?

perl - 如何覆盖 $dbh 上的提交以进行测试?

android - 带有 Android 的 Grape Rails API

ruby-on-rails - Rails ActionMailer w/Devise + Google Apps 处于开发模式

ruby-on-rails - 如何在 Rails 应用程序中使用长 id?

ruby - 您建议使用哪种 Ruby 解析器来解析 Ruby 源代码?

c++ - 可以滥用 reinterpret_cast 将对象转换为派生类吗?