2017-07-25 4 views
1

Hallo Ich habe eine einfache App, die ich erstellen und habe Probleme, die Fehlermeldungen angezeigt werden, wenn jemand ungültige Informationen oder überhaupt keine Informationen in ein Feld eingibt.Formular Fehlermeldung nicht in Rails App generieren

Das Formular, das ich verwende, ist, einen neuen Benutzer zu registrieren, der Code, der dem Benutzer und dem Formular zugeordnet ist, ist unten;

users_controller.rb

Class UsersController < ApplicationController 


    def index 
    @users = User.all 
    end 

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

    def new 
    @user = User.new 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     session[:user_id] = @user.id 
     redirect_to @user 
    else 
     redirect_to '/signup' 
    end 
    end 


    private 

    def user_params 
     params.require(:user).permit(:first_name, :last_name, :email, :password) 
    end 


end 

user.rb

class User < ApplicationRecord 

    before_save { self.email = email.downcase } 
    validates :first_name, presence: true, length: { maximum: 25 } 
    validates :first_name, presence: true, length: { maximum: 50 } 
    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i 
    validates :email, presence: true, length: { maximum: 255 }, format: { with: VALID_EMAIL_REGEX } 
    has_secure_password 
    validates :password, presence: true, length: { minimum: 6 } 

    has_many :trips 
    has_many :countries, through: :trips 

end 

new.html.erb

<div class="container"> 
    <h1 class="text-center">Sign up</h1> 
    <div class="row"> 
    <div class="col-md-6 offset-md-3 "> 
     <%=form_for(@user) do |f| %> 
     <%= render 'shared/error_messages' %> 

     <%= f.label :first_name %> 
     <%= f.text_field :first_name, class: "form-control" %> 

     <%= f.label :last_name %> 
     <%= f.text_field :last_name, class: "form-control" %> 

     <%= f.label :email %> 
     <%= f.email_field :email, class: "form-control" %> 

     <%= f.label :password %> 
     <%= f.password_field :password, class: "form-control" %> 

     <%= f.submit "Create an account", class: 'form-control btn btn-primary' %> 
     <% end %> 
    </div> 
    </div> 
</div> 

_error_messages.html.erb

<% if @user.errors.any? %> 
    <div class="alert alert-danger"> 
    The form contains <%= pluralize(@user.errors.count, "error") %>. 
    </div> 
    <ul> 
    <% @user.errors.full_messages.each do |msg| %> 
    <li><%= msg %></li> 
    <% end %> 
    </ul> 
<% else %> 
    <h3>test</h3> 
<% end %> 

Wenn ich das Formular lade ich das "Test" string tun sehen, die ich in meinem _error_messages.html.erb für Sichtbarkeit setzen. Wenn ich jedoch Daten auf der Anmeldeseite eintrage, wird die Seite neu geladen (wie es sollte, anstatt sie an die Benutzerseite zu senden, wenn alle Felder gültig sind). Die Zeichenfolge "Test" wird jedoch immer noch oben angezeigt und nicht die Fehlermeldungen, die angezeigt werden sollten.

Meine Annahme ist, ich brauche eine Art von Sitzung oder etwas zu erinnern, was die Fehler waren, wie es jetzt eine komplett neue Seite mit nichts im Speicher neu lädt, aber ich kann die Lösung zu diesem nirgendwo im Moment finden.

Jede Hilfe wäre sehr willkommen!

+2

Versuchen Sie 'redirect_to '/ signup'' zu' render'neuen'' zu ändern – Pavan

+1

Danke @Pavan, das funktioniert hat! Können Sie den Unterschied zwischen den beiden Aussagen erklären? –

+0

Ich habe meine Antwort hinzugefügt und den Unterschied erklärt.Ich hoffe, Sie finden es hilfreich :) – Pavan

Antwort

1

Wie gesagt, müssen Sie

redirect_to '/signup' 

zu

render 'new' 

Vom Guides

Die render Verfahren verwendet wird, so ändern, dass die @user Objekt übergeben zurück zu der new Vorlage, wenn es rende ist rot. Dieses Rendering erfolgt innerhalb von die gleiche Anfrage wie das Formular Einreichung, während die redirect_to den Browser sagen, um eine andere Anfrage zu stellen.

Das heißt, so wie die redirect_to Fragen eine neue Anforderung an den Browser, werden die Werte von @user verloren, mit anderen Worten @user ist eine neue Instanz, die wieder instanziiert wird. Deshalb gibt <% if @user.errors.any? %>immerfalse zurück, als ob es keine Fehler in @user gibt.

+1

Danke @Pavan! :) –

Verwandte Themen