【问题标题】:undefined method `errors' for nil:NilClass for displaying Rails validation errorsnil 的未定义方法“错误”:用于显示 Rails 验证错误的 NilClass
【发布时间】:2016-03-13 01:25:10
【问题描述】:

当我尝试在 Rails 中的验证视图中显示错误时,我收到了 undefined method 'errors' for nil:NilClass error。我遵循了这个例子Rails validation error messages displays the error messages and array,并考虑了它的答案。

我在用户模型中的验证示例是:
validates_length_of :dog_name, minimum: 0, maximum: 30, message: 'cannot have more than 30 characters'

查看代码

<% if @user.errors.any? %>
  <div id="errorExplanation">
    <ul>
      <% @user.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>

用户控制器

class UsersController < ApplicationController
    #before_action :logged_in_user, only: [:index, :edit, :update, :destroy,
    #:following, :followers]
    before_filter :requireLogin
    #before_action :requireDog

    def requireLogin
        if session[:user_id] == nil
            redirect_to "/"
        end
    end

    def requireDog
        @user = User.find(session[:user_id])
        if(@user.dog_name == "Empty")
            redirect_to "users/new/"
        end
    end

    def index
        @users = User.all
    end

    def show
        @user = User.find(params[:id])
        @current_user ||= User.find(session[:user_id]) if session[:user_id]
    end

    def new
        @user = User.new
        @current_user ||= User.find(session[:user_id]) if session[:user_id]
    end

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

    def following
        @title = "Following"
        @user  = User.find(params[:id])
        @users = @user.following.paginate(page: params[:page])
        render 'show_follow'
    end

    def followers
        @title = "Followers"
        @user  = User.find(params[:id])
        @users = @user.followers.paginate(page: params[:page])
        render 'show_follow'
    end

    def going
        @title = "Going"
        @user  = User.find(params[:id])
        @users = @user.going.paginate(page: params[:page])
        render 'show_gather'
    end

    def create
        @user = User.new(profile_params)
        if @user.save
            redirect_to '/users'
            else
            render 'new'
        end
    end

    private
    def profile_params
        params.require(:user).permit(:dog_name, :photo, :dog_breed, :dog_gender, :dog_age)
    end

end

在其他示例中,用户模型/控制器不需要进一步修改。用户确实存在。我是否缺少模型或控制器中的某些内容?

【问题讨论】:

  • 你能用持有@user的控制器方法更新你的问题吗?
  • 在您的情况下,@user nil,请在此处添加您的控制器代码
  • @Pavan,完成,对不起。
  • 为什么要同时设置@user@current_user
  • @user是页面所属的用户,@current_user是当前登录的用户。

标签: ruby-on-rails validation


【解决方案1】:

首先,你最好切换到新的validates methods

#app/models/user.rb
class User < ActiveRecord::Base
   validates :dog_name, length: { in: 0..30, message: 'cannot have more than 30 characters'}
end

-

其次,不要每次都设置@title - 为什么不直接使用action_name

每次加载动作时,controller_nameaction_name 变量都会默认设置,用于控制器或视图。为什么不在视图中使用action_name 变量?

#app/views/layouts/application.html.erb
<title><%= action_name if controller_name == "Users" %></title>

回答你的问题,错误是因为你试图调用一个不存在的变量的方法:

for nil:NilClass

Ruby 有一种有趣的方式来为未声明的变量发布异常——而不是表面上说该变量不存在,而是在 NilClass 类下调用它。

作为开发人员,您应该阅读undeclared method 的消息并推测它是未设置的变量...

因此,解决您的问题的方法是找出未设置变量的原因

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def new
      @user = User.new
   end

   def create
      @user = User.new profile_params
      redirect_to users_path if @user.save
   end
end

以上内容应该使您能够保存用户,否则它将重新呈现new 操作(并显示错误)。

我认为您遇到的问题是您在验证问题上显式加载 new 操作,这将阻止它附加所需的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多