2016-10-22 15 views
0

この質問は重複しているようですが、私は他の関連する質問をすべてチェックしました。Ruby on Rails - nilのための未定義メソッド `errors ':NilClass

ユーザー登録フォームを作成しようとしています。

私のユーザーモデル(user.rb)は次のようなものです。 (users_controller.rb)

class User < ApplicationRecord 
    attr_accessor :password 
    EMAIL_REGEX = /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i 
    validates :username, :presence => true, :uniqueness => true, :length => { :in => 4..20 } 
    validates :email, :presence => true, :uniqueness => true, :format => EMAIL_REGEX 
    validates :password, :confirmation => true #password_confirmation attr 
    validates_length_of :password, :in => 6..20, :on => :create 
end 

ユーザコントローラはこの

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

    def create 

    @user = User.new(user_params) 

    if @user.save 
     flash[:notice] = "You have signed up successdully" 
     flash[:color] = "valid" 
    else 
     flash[:notice] = "Invalid Input!" 
     flash[:color] = "invalid" 
    end 
    end 

    def user_params 
     params.require(:username).permit(:email, :password, :password_confirmation) 
    end  

    render "new" 

end 

とユーザー新しいビュー(new.html.erb)は次のようであるようなものです。この

Rails.application.routes.draw do 
    get 'users/new' 
    resources :users 

    # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html 
    root 'home#index' 
end 

すくいルートは出力以下の私を与えるよう

<% @page_title = "UserAuth | Signup" %> 
<div class="Sign_Form"> 
    <h1>Sign Up</h1> 
    <%= form_for(:user, :url => {:controller => 'users', :action => 'create'}) do |f| %> 
    <p> Username:</br> <%= f.text_field :username%> </p> 
    <p> Email:</br> <%= f.text_field :email%> </p> 
    <p> Password:</br> <%= f.password_field :password%></p> 
    <p> Password Confirmation:</br> <%= f.password_field :password_confirmation%> </p> 
    <%= f.submit :Signup %> 
    <% end %> 
    <% if @user.errors.any? %> 
    <ul class="Signup_Errors"> 
    <% for message_error in @user.errors.full_messages %> 
     <li>* <%= message_error %></li> 
    <% end %> 
    </ul> 
    <% end %> 
</div> 

ルート(routes.rbを)があります。私は私のブラウザからhttp://localhost/users/newにアクセスしようとすると、

Prefix Verb URI Pattern    Controller#Action 
users_new GET /users/new(.:format)  users#new 
    users GET /users(.:format)   users#index 
      POST /users(.:format)   users#create 
new_user GET /users/new(.:format)  users#new 
edit_user GET /users/:id/edit(.:format) users#edit 
    user GET /users/:id(.:format)  users#show 
      PATCH /users/:id(.:format)  users#update 
      PUT /users/:id(.:format)  users#update 
      DELETE /users/:id(.:format)  users#destroy 
    root GET /      home#index 

はまだ、私は次のエラーを取得します。

Showing C:/Sites/expenses/app/views/users/new.html.erb where line #11 raised: 

undefined method `errors' for nil:NilClass 
Extracted source (around line #11): 
9 
10 
11 
12 
13 
14 

    <%= f.submit :Signup %> 
    <% end %> 
    <% if @user.errors.any? %> 
    <ul class="Signup_Errors"> 
    <% for message_error in @user.errors.full_messages %> 
     <li>* <%= message_error %></li> 

答えて

1

レンダリングnewは作成時にエラーになるはずです。

これは、作成したアクションにエラーがある場合は、@userオブジェクトは、あなたがこれらのエラーをループ@user.errors.any?

を使用することができますので、そこにそれらのエラー

と一緒に戻って新しいフォームにスローされる、ということを意味

class UsersController < ApplicationController 

    def new 
    @user = User.new 
    end 

    def create 

    @user = User.new(user_params) 

    if @user.save 
     flash[:notice] = "You have signed up successdully" 
     flash[:color] = "valid" 
    else 
     flash[:notice] = "Invalid Input!" 
     flash[:color] = "invalid" 
     render "new" 
    end 
    end 

    def user_params 
     params.require(:username).permit(:email, :password, :password_confirmation) 
    end  
end 
関連する問題