为啥删除代码行会在 simple_form 中产生“nil:NilClass 的未定义方法‘错误’”

Posted

技术标签:

【中文标题】为啥删除代码行会在 simple_form 中产生“nil:NilClass 的未定义方法‘错误’”【英文标题】:Why does removing line of code produce "undefined method `errors' for nil:NilClass" in simple_form为什么删除代码行会在 simple_form 中产生“nil:NilClass 的未定义方法‘错误’” 【发布时间】:2021-09-30 01:45:45 【问题描述】:

我正在尝试为 Rails 应用设置我自己的身份验证系统。尝试加载我的登录页面时,我不断收到“nil:NilClass 的未定义方法‘错误’”错误。如果我取出以下代码,它可以正常工作,但我很好奇为什么会这样?代码应该保留而不是删除吗?

<%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

这是我拥有的所有其他东西:

控制器/会话/new.html.erb

<%= simple_form_for(:session, url: login_path) do |f| %>
  <%= f.error_notification %>
  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

  <div class="">
    <%= f.input :email %>
    <%= f.input :password, label: "Password" %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

控制器/users_controller.rb

  before_action :set_user, only: %i[ show edit update destroy ]

  # GET /users or /users.json
  def index
    @users = User.all
  end

  # GET /users/1 or /users/1.json
  def show
  end

  # GET /users/new
  def new
    @user = User.new
  end

  # GET /users/1/edit
  def edit
  end

  # POST /users or /users.json
  def create
    @user = User.new(user_params)
    if @user.save
      session[:user_id] = @user.id
    else
      redirect_to root_path
    end

    respond_to do |format|
      if @user.save
        format.html  redirect_to @user, notice: "User was successfully created." 
        format.json  render :show, status: :created, location: @user 
      else
        format.html  render :new, status: :unprocessable_entity 
        format.json  render json: @user.errors, status: :unprocessable_entity 
      end
    end
  end

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

    # Only allow a list of trusted parameters through.
    def user_params
      params.require(:user).permit(:first_name, :last_name, :email, :password)
    end
end

routes.rb

Rails.application.routes.draw do
  resources :users
  
  get 'login' => 'sessions#new'
  post 'login' => 'sessions#create'
  delete 'logout' => 'sessions#destroy'

  root 'main#index'
end

【问题讨论】:

【参考方案1】:

您的会话对象没有在任何地方实例化,您正在传递一个字符串。

<%= simple_form_for(:session, ...) %>

对于f.object.errors 来说,应该已经通过了类似于 ActiveRecord / ActiveModel 实例的工作。

【讨论】:

以上是关于为啥删除代码行会在 simple_form 中产生“nil:NilClass 的未定义方法‘错误’”的主要内容,如果未能解决你的问题,请参考以下文章

T-SQL为啥除以零不会在order by子句中产生错误

为啥 SQLite 替换功能会在我的 Android 应用程序中产生错误?

重新编译相同的代码会在 VC++ 中产生不同的可执行文件

Access 2013 中的 VB 脚本在 QuickBooks Enterprise 14 中产生“内存不足”错误

有没有办法查看哪一行代码在 python 中产生警告消息?

maven仓库中产生后缀LastUpdated文件