ActionController::ParamaterMissing 而 运行 测试。来自 Hartl 教程的第 7 章

ActionController::ParamaterMissing while running test. From Chapter 7 of Hartl's Tutorial

目前正在学习 Hartl 的(更新的)教程,我卡在了第 7 章的末尾[具体来说是 7.5.3,生产部署]。

我正在 运行 测试并收到以下错误:

1) Error:
UsersSignupTest#test_invalid_signup_information:
ActionController::ParameterMissing: param is missing or the value is empty: user
app/controllers/users_controller.rb:24:in `user_params'
app/controllers/users_controller.rb:12:in `create'
test/integration/users_signup_test.rb:8:in `block (2 levels) in <class:UsersSignupTest>'
test/integration/users_signup_test.rb:7:in `block in <class:UsersSignupTest>'


2) Error:
UsersSignupTest#test_valid_signup_information:
ActionController::ParameterMissing: param is missing or the value is empty: user
app/controllers/users_controller.rb:24:in `user_params'
app/controllers/users_controller.rb:12:in `create'
test/integration/users_signup_test.rb:19:in `block (2 levels) in <class:UsersSignupTest>'
test/integration/users_signup_test.rb:18:in `block in <class:UsersSignupTest>'

users_controller.rb

class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      flash[:success] = "Welcome to the Sample App!"
       redirect_to @user
    else
      render 'new'
    end
  end

  private

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

users_signup_test.rb

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path, params: { user: { name:  "",
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
                                         end
                                         end                                                              


  test "valid signup information" do
    get signup_path
    assert_difference 'User.count', 1 do
      post users_path, params: { user: { name:  "Example User",
                                         email: "user@example.com",
                                         password:              "password",
                                         password_confirmation: "password" } }
    end
    follow_redirect!
    assert_template 'users/show'
  end
end

你有参数,而不是用户。

改变这个:

 params: { name:  "", 
                      email: "user@invalid",
                      password: "foo",
                      password_confirmation: "bar" } }
       end
   end 

到这个:

  user: { name:  "", 
                          email: "user@invalid",
                          password: "foo",
                          password_confirmation: "bar" } }
          end
       end 

post(以及其他 HTTP 请求方法)的签名在 Rails 4 和 Rails 5 之间发生了变化。

所以在 Rails 中发送一个 user 参数 4 使用这个:

post user_path, { user: { name: 'foo' } }

而在 Rails 5 中使用此:

post user_path, params: { user: { name: 'foo' } }

Hartl 的 Rails 教程最近已更新至 Rails 5。但我猜你仍然是 运行 Rails 4. 这意味着:删除参数的嵌套或将你的应用程序更新为 Rails 5.