2016-10-22 2 views
0

Эти вопросы кажутся дублирующими, но я проверил все другие связанные вопросы, и ни один из ответов не применим, поскольку я пробовал их все.Ruby on Rails - неопределенный метод `errors 'for nil: NilClass

Я пытаюсь создать форму регистрации пользователя.

Моя модель пользователя (user.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 

Контроллер пользователя (users_controller.rb), как это

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), как это.

<% @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) подобны этому

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 

И грабли маршрут дает мне следующий вывод.

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 

Но когда я пытаюсь получить доступ к http://localhost/users/new из моего браузера, я получаю следующее сообщение об ошибке.

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

Render 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 
Смежные вопросы