【问题标题】:undefined method `errors' for nil:NilClass - Ruby on Railsnil 的未定义方法“错误”:NilClass - Ruby on Rails
【发布时间】:2016-04-11 14:13:24
【问题描述】:

我是 Ruby on Rails 的新手。我试图在注册时显示一条消息。请检查我的控制器并查看代码 -

users_controller.rb

class UsersController < ApplicationController
  #before_action :set_user, only: [:show, :edit, :update, :destroy, :success]

  def login
    render layout: false
  end
  def register
    render layout: false
    @user = User.new
  end

  def create_register
    @user = User.new(create_user_params)
    #raise @user.inspect
    respond_to do |format|
      if @user.save
        format.html { redirect_to @users, notice: 'Registration was successfully created.' }
        format.json { render :success, status: :created, location: @users }
      else
        format.html { render :register }
        format.json { render json: @ruby_win_source.errors, status: :unprocessable_entity }
      end
    end
  end

  def success
    raise @user.inspect
  end


  private
  # Use callbacks to share common setup or constraints between actions.
  def set_user
    @user = User.find(params[:id])
  end

  # Never trust parameters from the scary internet, only allow the white list through.
  def user_params
    params.require(:user).permit(:name, :username, :email, :password, :image, :dob, :photo, :address)
  end
end

register.html.erb

<%= form_tag(@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 %>

routes.rb

get    'register'   => 'users#register'
post   'register'   => 'users#create_register'

网址 - http://localhost:3000/register

当我加载这个页面时,我收到了这个错误信息 -

我在谷歌搜索并获得了一些相同的问题链接。按照步骤进行,但我的问题仍未解决。请帮帮我:(

【问题讨论】:

  • &lt;% if @user.errors.any? %&gt; 将其更改为 &lt;% if @user &amp;&amp; @user.errors.any? %&gt; - 看看您是否仍然看到相同的错误?
  • 是的,此问题已修复。但我收到另一个错误cannot load such file -- bcrypt_ext
  • @dkp 感谢您在这里发表评论。你的评论也对。

标签: ruby-on-rails ruby ruby-on-rails-3 registration


【解决方案1】:

您的 register 方法中的 2 行是相反的。试试这个:

def register
  @user = User.new
  render layout: false
end

【讨论】:

  • 是的,亲爱的,您是对的。我可以知道我为什么要反转吗?你能描述一下你的答案吗?
  • 一旦您调用渲染方法,模板就会被渲染,在您的情况下,模板会查找用户变量,但该变量尚未设置。
  • 正是玛戈所说的。您在实例化用户之前调用了渲染。
【解决方案2】:

在 create_register 方法中创建一个新用户调用

@user = User.new(create_user_params)

但是您的强参数方法被命名为 user_params。尝试将上面的行更改为

@user = User.new(user_params)

【讨论】:

  • 哦!对不起,我忘了改变它。我是create_user_params action。我在发布这个问题时删除了这个。 :(
  • 请相应地更新您的问题,因为它非常具有误导性。
  • 我在register 操作中遇到问题。 create_register 行动是不同的东西。所以不需要更新问题。我得到了我的答案。感谢您在这里回答。
【解决方案3】:

您正在尝试在 nil 类上运行方法 errors。做 Rails 时很常见的问题。这一行

<%= form_tag(@user) do |f| %> <% if @user.errors.any? %>

正在寻找@user 对象。您确实尝试在这里声明一个:

def register render layout: false @user = User.new end

但基于错误,我将假定它失败了。没有看到用户表的迁移我猜你没有创建一个?要为活动记录类创建新的 User 对象,您需要对数据库运行迁移,以便有一个表可以使用。

http://guides.rubyonrails.org/active_record_migrations.html

我也没有在这里看到模型。对于用户User.new,您还需要一个模型。

http://guides.rubyonrails.org/active_record_basics.html

现在还有另一种工具可以让您在 Rails 中工作变得更加轻松。

http://pryrepl.org/

有史以来最酷的工具。只需安装 pry gem,需要 pry 并在需要 pry 进入代码的任何地方放置一个带有 binding.pry 的换行符,您就可以直接使用代码。对于这种情况,我会这样做。

def register render layout: false require `pry`; binding.pry; @user = User.new end

然后转到您正在运行服务器的终端,您就在代码中。然后尝试代码的失败部分。 @user = User.new 它会给你一个更有启发性的错误信息。

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多