【问题标题】:Hartl Section 9.1.3: test_unsuccessful_edit fails with error ParameterMissing "user"Hartl 第 9.1.3 节:test_unsuccessful_edit 失败并出现错误 ParameterMissing "user"
【发布时间】:2015-11-08 21:05:19
【问题描述】:

我正在浏览 Michael Hartl 的 Ruby on Rails 教程,遇到了一个我无法解决的问题。由于我不明白的原因,编辑用户 (users_edit_test.rb) 的测试失败了。由于本教程主要是复制代码的练习,如果已经检查并仔细检查了我的打字,但我找不到我搞砸的地方。而且,更重要的是,我想了解发生了什么。您能提供的任何帮助将不胜感激。

错误消息(包括在下面)似乎表明测试正在启动用户控制器 (users_controller.rb) 中的 edit 方法,该方法又会启动同一控制器中的私有 user_params 方法。 user_params 方法设置需要 user 参数的强参数,并允许 nameemail密码password_confirmation 参数。测试运行时user参数不存在,所以返回错误。

我的第一个问题是,“user 参数是什么?” nameemailpasswordpassword_confirmation 参数均引用 users 中的列strong> 数据库,还有一个 id 列。但是没有 user 列。测试和控制器都有一个 @user 变量。那是 user 参数吗?这似乎没有意义,因为我应该能够随心所欲地调用变量,对吧?我觉得这里有一些基本的东西我没有得到,如果我得到了,我可以解决这个问题并回答第二个问题,“我搞砸了什么/如何解决这个问题?”,我自己。

users_edit_test.rb

require 'test_helper'

class UsersEditTest < ActionDispatch::IntegrationTest

  def setup
    @user = users(:michael)
  end

  test "unsuccessful edit" do
    get edit_user_path(@user)
    #assert_template 'users/edit'
    #patch user_path(@user), user: { name: "", 
    #                                email: "foo@invalid", 
    #                                password: "foo", 
    #                                password_confirmation: "bar" }
    #assert_template 'users/edit'
  end

end

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
      log_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

  def edit
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      # Handle a successful update.
    else
      render 'edit'
    end
  end

  private

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

end

users.yml

michael:
  name: Michael Example
  email: michael@example.com
  password_digest: <%= User.digest('password') %>

测试输出

开始

错误[“test_unsuccessful_edit”,UsersEditTest,2015-05-14 00:05:19 +0000]
test_unsuccessful_edit#UsersEditTest (1431561919.08s)
ActionController::ParameterMissing:
ActionController::ParameterMissing: 参数丢失或值为空: user
app/controllers/users_controller.rb:34:in user_params
app/controllers/users_controller.rb:24:编辑中
test/integration/users_edit_test.rb:10:in 类中的块:UsersEditTest
app/controllers/users_controller.rb:34:in user_params
app/controllers/users_controller.rb:24:编辑中
test/integration/users_edit_test.rb:10:in 类中的块:UsersEditTest

27/27:
[================================================== =================]
100% 时间:00:00:00,时间:00:00:00

在 0.69446 秒内完成 27 次测试,60 次断言,0 次失败,1 次错误,0 次跳过

【问题讨论】:

    标签: railstutorial.org


    【解决方案1】:

    对于初学者:您可能应该在get edit_user_path(@user) 之前使用log_in as(@user) 开始测试。 这是问题的一部分:登录用户提供了您正在寻找的参数信息。 参数由浏览器发送到控制器操作之一。这可能是您启动 Rails 时最困难的部分之一;您可能想在 rails 中找到有关请求/响应周期的一些信息,以及它们如何映射到控制器操作。 (顺便问一下,为什么你的测试行在你的问题中被注释掉了?)

    【讨论】:

    • 感谢您回复我,@Mauddev。我注释掉了这些行以验证错误来自 'get edit_user_path(@user)' 行,而不是 'patch user_path(@user)' 行,后者传递了 'user:' 块(这是一个块,对吗?)我本可以搞砸的。根据作者的说法,此时测试应该在没有 'log_in_as(@user)' 命令的情况下工作; Hartl 直到第 9.2.1 节才明确将该命令添加到此测试中。我将对请求/响应周期进行一些研究,看看它会把我带到哪里。
    • 哦,好的。 1)这是一个哈希,而不是一个块,AFAIK。 2) 我曾经得到的关于动作的路由的最清楚的解释是在这个视频中:youtube.com/watch?v=g3SuV-A9bak。 3)如果您尝试通过单击浏览器来编辑用户,您可以这样做吗? (老派测试;-))
    【解决方案2】:

    你应该实现方法Update,那么就没有错误了。

     def edit
        @user = User.find(params[:id])
      end
    
      def update
        @user = User.find(params[:id])
        if @user.update_attributes(user_params)
          flash[:success] = "Profile updated"
          redirect_to @user
        else
          render 'edit'
        end
      end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      • 2012-09-24
      • 2013-07-18
      • 2021-10-12
      • 2020-10-23
      • 2020-07-20
      • 2011-05-25
      相关资源
      最近更新 更多