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.
目前正在学习 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.