错误:nil的未定义方法`update_attributes':我更新用户信息时的NilClass

时间:2016-01-19 05:05:22

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

为什么不在更新显示此错误的用户信息时更新用户信息:

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

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

控制器:

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 }

由于

3 个答案:

答案 0 :(得分:1)

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

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

很好地代表了这个网站:Update

你看到了这个

希望能帮到你

答案 1 :(得分:0)

  

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

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

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

答案 2 :(得分:0)

这样做:

#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 %>

-

update_attributes上呼叫@users要求@users成为班级的实例。在您的情况下,它尚未被调用,这会导致NilClass错误。

由于Ruby是面向对象的语言,因此它将每个数据视为对象,甚至是未声明的对象。当您看到undefined method for NilClass错误时,它基本上意味着您正在尝试操纵不存在的变量。