繁体   English   中英

如何解决nil:NilClass错误的未定义方法`update_attributes'

[英]How to resolve undefined method `update_attributes' for nil:NilClass error

任何人都可以帮助我解决此错误。当我更新数据库值时,出现以下错误。

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

我的代码段如下。

views / users / index.html.erb:

<h1>This is index page</h1>
<center>
<p>Enter data</p>
 <div class="option">
   <p><%= link_to "Click here to enter data",users_new_path %></p>
   <p><%= link_to "Display data",users_show_path%></p>
 </div>

 </center>

views / users / show.html.erb

<h1>Show your data</h1>
<center>
  <ul>
    <% @user.each do |t| %>
    <li>
      <%= t.name %> |
     <%= t.email %> |
      <%= t.password%> |
      <%= t.created_at %>
      <%= link_to "edit",users_edit_path(:id => t.id) %>
    </li>
        <% end %>
  </ul>
  <div class="back_btn">
    <a href="/users/index"><button type="button" class="btn-custom " style="cursor:pointer;">Back</button></a>
  </div>
</center>

views / users / new.html.erb:

<h1>Enter your data here</h1>
<center>
  <%= form_for @user ,:url => {:action => "create"} do |f| %>
  <div class="div_reg">
    <p>
      <label for="username" class="uname" data-icon="u" >username </label>&nbsp;
      <%= f.text_field:name,placeholder:"Enter your user name" %>
    </p>
    <p>
      <label for="username" class="uname" data-icon="u" >Email </label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      <%= f.text_field:email,placeholder:"enter your email" %>
    </p>
    <p>
      <label for="username" class="uname" data-icon="u" >Password </label>&nbsp;&nbsp;
      <%= f.password_field:password,placeholder:"Enteryour password" %>
    </p>
    <p>
      <label for="username" class="uname" data-icon="u" >Password </label>&nbsp;&nbsp;
      <%= f.password_field  :password_confirmation %>
    </p>
    <center>
      <%= f.submit "Submit",:class => 'btn-custom' %>
    </center>
    <div class="back_btn">
      <a href="/users/index"><button type="button" class="btn-custom " style="cursor:pointer;">Back</button></a>
    </div>
  </div>
      <% end %>
</center>
<% if @user.errors.any? %>
    <ul class="Signup_Errors">
      <% for message_error in @user.errors.full_messages %>
          <li><%= message_error %></li>
      <% end %>
    </ul>
<% end %>

views / users / edit.html.erb:

<h1>Edit your data here</h1>
<center>
  <%= form_for @user ,:url => {:action => "update"} do |f| %>
      <div class="div_reg">
        <p>
          <label for="username" class="uname" data-icon="u" >username </label>&nbsp;
          <%= f.text_field:name,placeholder:"Enter your user name" %>
        </p>
        <p>
          <label for="username" class="uname" data-icon="u" >Email </label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
          <%= f.text_field:email,placeholder:"enter your email" %>
        </p>
        <p>
          <label for="username" class="uname" data-icon="u" >Password </label>&nbsp;&nbsp;
          <%= f.password_field:password,placeholder:"Enteryour password" %>
        </p>
        <p>
          <label for="username" class="uname" data-icon="u" >Password </label>&nbsp;&nbsp;
          <%= f.password_field  :password_confirmation %>
        </p>
        <center>
          <%= f.submit "Update",:class => 'btn-custom' %>
        </center>
        <div class="back_btn">
          <a href="/users/index"><button type="button" class="btn-custom " style="cursor:pointer;">Back</button></a>
        </div>
      </div>
  <% end %>
</center>
<% if @user.errors.any? %>
    <ul class="Signup_Errors">
      <% for message_error in @user.errors.full_messages %>
          <li><%= message_error %></li>
      <% end %>
    </ul>
<% end %>

controller / users_controller.rb:

class UsersController < ApplicationController
  def index

  end
  def new
@user=User.new
  end
  def create
@user=User.new(users_param);
    if @user.save
 flash[:notice]="You signed up successfully"
      flash[:color]="valid"
      redirect_to :action => 'index'
    else
      flash[:alert]="You have not signed up successfully"
      flash[:color]="invalid"
      redirect_to :action => 'new'
    end
  end
  def show
    @user=User.all
  end
  def edit
    @user=User.new
  end
  def update
    @user=User.find_by_id(params[:id])
    if @user.update_attributes(update_params)
      flash[:notice]="Your data is updated succesfully"
      flash[:color]="valid"
      redirect_to :action => 'show'
    else
      flash[:alert]="Your data could not update,Please check it..!!"
      flash[:color]="invalid"
      redirect_to :action => 'edit'
    end
  end
  private
  def users_param
    params.require(:user).permit(:name, :email, :password,:password_confirmation)
  end
  def update_params
    params.require(:user).permit(:name,:email,:password,:password_confirmation)
  end
end

config / routes.rb:

Rails.application.routes.draw do
  root "users#index"
  get "users/new" => "users#new"
  get "users/index" => "users#index"
  post "users/create" => "users#create"
  get "users/show" => "users#show"
  get "users/edit" => "users#edit"
  post "users/update" => "users#update"
end

型号/user.rb:

class User < ActiveRecord::Base
  #attr_accessor :password
  #attr_accessor :name
  #attr_accessor :email
  EMAIL_REGEX = /\A[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\z/i
  validates :name, :presence => true, :uniqueness => true, :length => { :in => 3..20 }
  validates :email, :presence => true, :uniqueness => true, :format => EMAIL_REGEX
  validates :password, :confirmation => true
  validates_length_of :password, :in => 6..20, :on => :create
end

请帮助我解决给定的错误。我使用的是Rails版本4和ruby 1.9.3。

路线是错误的,它们没有考虑:id参数。 因此,该操作无法加载相应的用户。

上面的代码中有几个错误。 这是一个非常简单的脚手架,您应该使用rails g scaffold并生成脚手架,以便您可以学习如何正确使用Rails约定。

所有这些路线都可以删除

get "users/new" => "users#new"
get "users/index" => "users#index"
post "users/create" => "users#create"
get "users/show" => "users#show"
get "users/edit" => "users#edit"
post "users/update" => "users#update"

并替换为资源

resources :users

编辑应加载现有资源,而不是创建新资源。

def edit
  @user = User.find(params[:id])
end

同样适用于更新。 使用find,以便在找不到资源的情况下引发。

def update
  @user = User.find(params[:id])

同样,还有很多清理工作要做。 我建议您开始从默认支架读取代码并相应地修复代码。

我已经清理了controller和routes.rb。 查看是否有帮助
controller / users_controller.rb:

class UsersController < ApplicationController
  def index
    @user = User.all
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(users_params)
    if @user.save
      flash[:notice] = 'You signed up successfully'
      flash[:color] = 'valid'
      redirect_to action: 'index'
    else
      flash[:alert] = 'You have not signed up successfully'
      flash[:color] = 'invalid'
      redirect_to action: 'new'
    end
  end

  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(users_params)
      flash[:notice] = 'Your data is updated succesfully'
      flash[:color] = 'valid'
      redirect_to action: 'show'
    else
      flash[:alert] = 'Your data could not update,Please check it..!!'
      flash[:color] = 'invalid'
      redirect_to action: 'edit'
    end
  end

  private
  def users_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end

config / routes.rb:

Rails.application.routes.draw do
  root 'users#index'
  resources: :users
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM