【问题标题】:Error: undefined method `update_attributes' for nil:NilClass when I updating my user information错误:当我更新我的用户信息时,nil:NilClass 的未定义方法“update_attributes”
【发布时间】:2016-01-19 05:05:22
【问题描述】:

为什么不更新用户信息,当我更新用户信息时显示这个错误:

nil:NilClass 的未定义方法“update_attributes”

我的代码出了什么问题,如下所示:

控制器:

def edit
  @users= User.find(params[:user_id])
end

def update
 #@users= User.find(params[:user_id])
 if @users.update_attributes(user_params)
  flash[:notice] = "User updated"
  render 'edit'
 else
  render 'edit'
 end
end

private

def user_params
  params.require(:users).permit(:first_name, :last_name, :father_name, :mother_name )
end

表格:

<%= form_for :users, url: edit_path(@users), action: :update, method: :post  do |f| %>
   <%= f.text_field :first_name %>
   <%= f.text_field :last_name %>
   <%= f.text_field :father_name %>
   <%= f.text_field :mother_name %>

   <%= f.submit "Update" %>
<% end %>

路线:

 get  'edit'   => 'users#edit'
 post  'edit'   => 'users#update'

型号:

before_save { email.downcase! }

validates :first_name, :presence => true, :length => { :in => 3..20 }
validates :last_name, :presence => true, :length => { :in => 3..20 }
validates :email, :presence => true, :uniqueness => true, format: { with: /\A[^@\s]+@([^@.\s]+\.)+[^@.\s]+\z/ }

has_secure_password
#validates :password, presence: true, length: { minimum: 6 }

谢谢

【问题讨论】:

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


    【解决方案1】:

    您在更新表单部分添加密码字段并取消注释此行:

    #@users= User.find(params[:user_id]).

    很好地代表本站:Update

    你看这个

    希望能帮到你

    【讨论】:

    • 请尝试对单个记录使用单数变量名 - '@user'。 '@users' - 代表用户数组,会让其他人看不到代码
    【解决方案2】:

    nil:NilClass 的未定义方法 `update_attributes'

    您需要在update 操作中取消注释 #@users= User.find(params[:user_id]) 行。

    def update
      @users= User.find(params[:user_id])
      if @users.update_attributes(user_params)
        flash[:notice] = "User updated"
        render 'edit'
      else
        render 'edit'
      end
    end
    

    【讨论】:

    • 如果 uncomment 此行未显示错误但属性未更新
    • @try 你需要把form_for中的method: :post改成method: :put
    【解决方案3】:

    这样做:

    #config/routes.rb
    resources :users, only: [:edit, :update] #-> url.com/users/:id/edit
    
    #app/controllers/users_controller.rb
    class UsersController < ApplicationController
       def edit
          @user = User.find params[:id]
       end
    
       def update
          @user = User.find params[:id] #-> this is where your error occurs
          @user.update user_params
       end
    
       private
    
       def user_params
          params.require(:user).permit(:first_name, :last_name, :father_name, :mother_name)
       end
    end
    
    #app/views/users/edit.html.erb
    <%= form_for @user do |f| %>
       <% fields = @user.attributes - %i(id created_at updated_at) %>
       <% fields.each do |field| %>
          <%= f.text_field field %>
       <% end %>
       <%= f.submit %>
    <% end %>
    

    --

    @users 上调用update_attributes 要求@users 是一个类的实例。在您的情况下,它尚未被调用,这会导致 NilClass 错误。

    由于 Ruby 是一种面向对象的语言,它把每一条数据都当作一个对象,即使是未声明的。当您看到undefined method for NilClass 错误时,基本上意味着您正在尝试操纵一个不存在的变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多