2017-06-05 52 views
0

如果驗證失敗...「電子郵件已經採取」 redirect_to的登錄頁面

user.rb

validates :name, presence: true, length: { maximum: 20 } 
    validates :last_name, presence: true, length: { maximum: 20 } 
    validates :email, presence: true, length: { maximum: 255 }, uniqueness: { case_sensitive: false }, unless: -> { from_omniauth? } 
    has_secure_password 

因爲「電子郵件已經採取」,用戶應被重定向到sessions/new以其他方式登錄users/new頁面應刷新並顯示相應的錯誤消息,例如「密碼不能爲空」。

users_controller

if # How to make conditional work where if email is already taken do this... 
    flash[:alert] = "EMAIL ALREADY TAKEN. LOG IN WITH EMAIL" 
    render 'sessions/new' 
    else 
    render 'new' 
    end 

用戶把已經存在的電子郵件...

Processing by UsersController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"teFpI/xcFe4Ngdtcj8+7DEj+3ipMBObjzBjs143ILQ/bpefsZSuWWh7cxKJJRXqmCAW+35/H9UPKB56SDdO+6A==", "user"=>{"name"=>"test", "last_name"=>"mon", "email"=>"[email protected]", "password"=>"[FILTERED]", "time_zone"=>"Eastern Time (US & Canada)", "subscribe"=>"0"}, "button"=>""} 
    (0.2ms) BEGIN 
    User Exists (0.5ms) SELECT 1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('[email protected]') LIMIT 1 
    (0.2ms) ROLLBACK 
    Rendered sessions/new.html.erb within layouts/application (2.0ms) 
    Rendered layouts/_header.html.erb (1.4ms) 
Completed 200 OK in 496ms (Views: 159.6ms | ActiveRecord: 4.7ms) 

user.rb

validates :name, presence: true, length: { maximum: 20 } 
    validates :last_name, presence: true, length: { maximum: 20 } 
    validates :email, presence: true, length: { maximum: 255 }, uniqueness: { case_sensitive: false }, unless: -> { from_omniauth? } 
    has_secure_password 

回答

1

我會做這樣的事情:

def create 
    if User.find_by(email: params[:user][:email]).present? 
    flash[:alert] = "EMAIL ALREADY TAKEN. LOG IN WITH EMAIL" 
    render 'sessions/new' 
    else 
    @user = User.new(user_params) 

    if @user.save 
     # handle successful save 
    else 
     render 'new' 
    end 
    end 
end 
+0

既然你不創建一個變量'@ user'(因爲'return')錯誤消息不顯示。 –

+0

@Зелёный哦,很好,趕快,謝謝!答案已更新。 – Gerry

1

如果find_by_email回報的東西nil不同的現有記錄尋找的電子郵件時,您可以檢查:

if User.find_by(email: params[:user][:email]) 
    flash[:alert] = "EMAIL ALREADY TAKEN. LOG IN WITH EMAIL" 
    render 'sessions/new' 
else 
    render 'new' 
end 

或者,如果你想更具體,你可以使用ActiveRecord#exists?

if User.exists?(email: params[:user][:email]) 
    flash[:alert] = "EMAIL ALREADY TAKEN. LOG IN WITH EMAIL" 
    render 'sessions/new' 
else 
    render 'new' 
end 
+1

仔細看看你的第一個例子,你只是檢查params是否包含值,並顯示郵件已經被使用的信息,是否是錯誤的? –

+0

完全正確,謝謝@Зелёный –

相關問題