ruby-on-rails - 分配(:user) returning nil rather than user

标签 ruby-on-rails ruby-on-rails-4

我编写的以下测试是:

  test "valid signup information with account activation" do
    get root_path
    assert_difference 'User.count', 1 do
      post_via_redirect users_path, user: { user_name: "Example1234",
                                            email: "user1234@example.com",
                                            password: "password",
                                            password_confirmation: "password"}
    end
    assert_equal 1, ActionMailer::Base.deliveries.size
    user = assigns(:user)
    assert_not user.activated?
    #Try to log in before activation.
    log_in_as(user)
    assert_not is_logged_in?
    #Invalid activation token
    get edit_account_activation_path("invalidtoken", email: user.email)
    assert_not is_logged_in?
    #Valid token, wrong email
    get edit_account_activation_path(user.activation_token, email: "wrongemail")
    assert_not is_logged_in?
    #Valid activation token
    get edit_account_activation_path(user.activation_token, email: user.email)
    assert user.reload.activated?
    follow_redirect!
    assert_template 'recipes/index'
    assert is_logged_in?
  end

我收到以下错误:
ERROR["test_valid_signup_information_with_account_activation", UsersSignupTest, 1.4278587700100616]
 test_valid_signup_information_with_account_activation#UsersSignupTest (1.43s)
NoMethodError:         NoMethodError: undefined method `activated?' for nil:NilClass
            test/integration/users_signup_test.rb:30:in `block in <class:UsersSignupTest>'

请注意,第 30 行是第一个 assert_not user.activated?

似乎assigns(:user) 没有得到实际用户,我似乎无法弄清楚原因。

我正在关注 Hartl 的教程,这是 Chapter 10 中的测试.为什么用户不回来的任何想法

编辑:

这是我的 Controller 代码:
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]
  before_action :logged_in_user, only: [:edit, :update]
  before_action :correct_user, only: [:edit, :update]
  .....

   def create
    @user = User.new(user_params)
    respond_to do |format|
      if @user.save
        @user.send_activation_email
        format.html { redirect_to root_url notice: 'Please check your email to activate.' }
        format.json { head :no_content }
      else
        format.html { render 'new' }
        format.json { render json: @user.errors }
      end
    end
  end
  ...
end

这是我的帐户激活 Controller 。
class AccountActivationsController < ApplicationController

  def edit
    user = User.find_by(email: params[:email])
    if user && !user.activated? && user.authenticated?(:activation, params[:id])
      user.activate
      log_in user
      flash[:success] = "Account activated! Welcome!."
      redirect_to recipes_url
    else
      flash[:danger] = "Invalid activation link."
      redirect_to root_url
    end
  end
end

最佳答案

好的!所以我最终想出了这个。

我仍然不确定为什么,但我将测试中的代码从 post_via_redirect 更改为只是一个帖子并且它正常工作。

我这样做主要是因为我在 documentation 中注意到了对于assigns(:),它是在post 之后而不是post_via_redirect 之后。

关于ruby-on-rails - 分配(:user) returning nil rather than user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36747710/

相关文章:

ruby-on-rails - Rails 6 期望文件定义常量

javascript - Rails - 样式表要求 - 为每个页面选择特定的样式表

ruby-on-rails - Rspec 测试 API 版本控制

ruby-on-rails - 如何更改现有的评论模型,使其可以属于许多不同的模型?

angularjs - 有没有办法在不改变路线的情况下向我已经构建的 Rails 应用程序添加 Angular ?

ruby-on-rails - 命名间距 Controller 时,命名空间还有什么?

ruby-on-rails - 在 ruby​​ on Rails 中单击按钮时调用操作

ruby-on-rails - 无法在 Rails 中使用 ActiveRecord 和 PostgreSQL 从每个组中选择不同的行

ruby-on-rails - '需要': cannot load such file -- 'nokogiri\nokogiri' (LoadError) when running `rails server`

ruby-on-rails - 如何在 Liquid 中本地化日期?