2017-07-25 38 views
1

嗨我有一個簡單的應用程序,我正在構建,並且遇到有人輸入無效信息或根本沒有信息到字段時出現錯誤消息出現問題。窗體錯誤消息不生成Rails應用程序

我正在使用的表單是註冊一個新用戶,與用戶和表單關聯的代碼如下所示;

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

當我打開我確實看到了「測試」的字符串,我把我的_error_messages.html.erb能見度形式。但是,當我在註冊頁面中輸入數據時,它會重新加載頁面(因爲它應該在所有字段都有效時發送給用戶頁面)。但是,「Test」字符串仍然出現在頂部,而不是應該出現的錯誤消息。

我的假設是我需要某種會話或某些東西來記住錯誤是什麼,因爲現在它重新加載了一個全新的頁面,內存中沒有任何內容,但是,目前我無法在任何地方找到解決方案。

任何幫助將不勝感激!

+2

嘗試將'redirect_to'/ signup''更改爲'render'new'' – Pavan

+1

謝謝@Pavan工作!你能解釋兩種表述之間的區別嗎? –

+0

我已經添加了我的答案並解釋了其中的差異。希望你覺得它有幫助:) – Pavan

回答

1

正如我所說的,你需要改變

redirect_to '/signup' 

render 'new' 

Guides

時,使用render方法,以便@user對象被傳遞迴 當它被渲染時,模板到new模板紅。該呈現在 內完成與表單提交相同的請求,而redirect_to將 告訴瀏覽器發出另一個請求。

這就是說,這樣的redirect_to問題新的請求到瀏覽器中,@user值丟失,換句話說@user是再次實例化一個新的實例。這就是爲什麼<% if @user.errors.any? %>總是返回false好像在@user沒有錯誤。

+1

謝謝@Pavan! :) –