2011-07-12 26 views
9

Tôi đang sử dụng tính năng đăng nhập và đăng ký biểu mẫu trong cùng một trang, bây giờ khi tôi ghi chi tiết đăng nhập không hợp lệ hoặc không điền dữ liệu đầu vào bắt buộc vào biểu mẫu đăng ký.cách hiển thị thông báo lỗi khi tôi đăng nhập và đăng ký biểu mẫu trong cùng một trang

Tôi đang chuyển hướng đến trang /users nếu tôi đang cố gắng để đăng ký hoặc đến /users/sign_in nếu tôi cố gắng đăng nhập với các lỗi tôi đã làm ...

Tôi muốn ở lại trong cùng một trang và hiển thị các lỗi trong cùng một trang.

Tôi có thể làm điều đó bằng cách nào?

cảm ơn bạn rất nhiều, tôi cần một sự giúp đỡ nhanh chóng :)

Trả lời

17

tôi tìm thấy giải pháp cho vấn đề này trên Stackoverflow một số thời gian trước đây. Đây là những gì làm việc cho tôi

# In application.html.erb 
<% flash.each do |name, msg| %> 

    # New code (allow for flash elements to be arrays) 
    <% if msg.class == Array %> 
    <% msg.each do |message| %> 
     <%= content_tag :div, message, :id => "flash_#{name}" %> 
    <% end %> 
    <% else %> 

    # old code 
    <%= content_tag :div, msg, :id => "flash_#{name}" %> 

    <% end %> #don't forget the extra end 
<% end %> 

# Wherever you want Devise's error messages to be handled like 
# your other error messages 
# (in my case, registrations_controller.rb, a custom controller) 
flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages 

Xem bài gốc here

... và nghĩ về việc chấp nhận câu trả lời, 50% là một chút thấp! ;)

===== EDIT =====

Nếu bạn cần phải chuyển hướng đến một trang khác khi lỗi xảy ra, bạn sẽ phải ghi đè lên bộ điều khiển (kiểm tra lập mưu Wiki hoặc tìm kiếm stackoverflow cho howto) nhưng nó sẽ trông giống như một cái gì đó như thế

# CUSTOM DEVISE CONTROLLER 
class RegistrationsController < Devise::RegistrationsController 

    # POST /resource 
    def create 
    build_resource 

    if resource.save 
     if resource.active_for_authentication?  
     set_flash_message :notice, :signed_up if is_navigational_format? 
     sign_in(resource_name, resource) 
     respond_with resource, :location => redirect_location(resource_name, resource) 
     else 
     set_flash_message :notice, :inactive_signed_up, :reason => resource.inactive_message.to_s if is_navigational_format? 
     expire_session_data_after_sign_in! 
     respond_with resource, :location => after_inactive_sign_up_path_for(resource) 
     end 
    else 
     clean_up_passwords(resource) 
     # Solution for displaying Devise errors on the homepage found on: 
     # https://stackoverflow.com/questions/4101641/rails-devise-handling-devise-error-messages 
     flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages 
     redirect_to root_path # HERE IS THE PATH YOU WANT TO CHANGE 
    end 
    end 
end 
+0

không làm việc ... khi tôi bấm vào đăng nhập hoặc đăng ký tôi stil chuyển hướng đến trang anthoer và có tôi nhận được các lỗi ... – gal

+0

Bạn cần phải ghi đè lên bộ điều khiển và thay đổi của bạn tuyến đường phản hồi. Xem chỉnh sửa của tôi. – Lucas

+0

bạn quên yêu cầu tôi đưa vào các tuyến đường:: registrations => "registration" – gal

6

Sau nhiều tìm kiếm, tôi thấy rằng sau đây đã làm việc khá tốt cho mục đích của tôi. Chỉ cần tạo Devise Helper và lưu trữ resource.errors.full_messages trong một vùng chứa lỗi flash.

Cụ thể:

module DeviseHelper 

    def devise_error_messages! 
    flash[:error] = resource.errors.full_messages.first 
    end 
end 
+0

Điều này hoạt động tốt khi * đăng ký *, nhưng đối tượng người dùng không có bất kỳ lỗi nào khi không tìm thấy khi đăng nhập *. – smtlaissezfaire

3

chỉ là một điều nhỏ thêm:

Không in ra toàn bộ băm flash, chỉ in các phím cụ thể. Trong một số trường hợp, Devise thêm khóa: timedout vào băm flash, không có nghĩa là để hiển thị. Xóa khóa này khỏi băm nếu bạn dự định in toàn bộ băm.

7
Just add this code under devise->sessions->new.html.erb(View part) 
    <%= devise_error_messages! %> 
    <% flash.each do |key, value| %> 
     <div class="flash <%= key %>"><%= value %></div> 
    <% end %> 
+0

Đây là giải pháp đơn giản nhất đối với tôi. – smtlaissezfaire

Các vấn đề liên quan