2012-10-01 31 views
14

Tôi có một ứng dụng với người dùng và sự kiện. Mỗi người dùng có một số sự kiện. Khi một người dùng muốn xem một sự kiện cụ thể, ông sẽ nhận được hành động này:cách xử lý ActiveRecord :: RecordNotFound trong bộ điều khiển đường ray?

def show 
    begin 
    @userEvents = current_user.event 
    @event = @userEvents.find(params[:id]) 
    rescue ActiveRecord::RecordNotFound 
    redirect_to :controller => "main", :action => "index" 
    end 

    respond_to do |format| 
    format.html # show.html.erb 
    format.json { render json: @event } 
    end 
end 

Nếu sự kiện không được tìm thấy cho người sử dụng nó có nghĩa là anh ấy chơi với URL và sự kiện ông đang cố gắng để có được không thuộc về cho anh ta. Tôi muốn chuyển hướng anh ta đến trang chính hoặc chỉ hiển thị trang có lỗi mà sự kiện không được tìm thấy. Nếu tôi cố chạy mã ở trên lỗi này kích hoạt:

AbstractController::DoubleRenderError in EventsController#show 

Cách tốt nhất để khắc phục sự cố này là gì?

Trả lời

20

Đặt trở sau khi chuyển hướng

begin 
@userEvents = current_user.event 
@event = @userEvents.find(params[:id]) 
rescue ActiveRecord::RecordNotFound 
redirect_to :controller => "main", :action => "index" 
return 
end 
+0

oh ơn chúa .... gửi tin nhắn từ tương lai =) –

14

Calling redirect_to không trả lại từ phương pháp hành động của bạn đó là lý do chuyển sang khối respond_to làm cho DoubleRenderError. Một cách để khắc phục điều đó là với:

redirect_to :controller => "main", :action => "index" and return 

Tuy nhiên, một giải pháp tốt hơn có thể là một trong hai rescue from ngoại lệ này khai báo hoặc chỉ để cho nó tuyên truyền cho khách hàng. Giao diện cũ giống như sau:

class YourController < ActionController::Base 

    rescue_from ActiveRecord::RecordNotFound, with: :dude_wheres_my_record 

    def show 
    # your original code without the begin and rescue 
    end 

    def dude_where_my_record 
    # special handling here 
    end 
end 

Nếu bạn chỉ cho phép ngoại lệ người dùng sẽ thấy trang public/404.html ở chế độ sản xuất.

+0

không yên tĩnh hiểu giải pháp của bạn ... tại sao giải cứu đó xảy ra mỗi lần trong bộ điều khiển? .. tôi cần nó chỉ trong hiển thị hành động. nhưng cảm ơn –

+0

'rescue_from' chỉ là một cách tốt hơn để đối phó với các lỗi phổ biến ở lần, cho phép bạn tách riêng các mối quan tâm trong mã của bạn. Tất nhiên nó không phải lúc nào cũng tốt hơn, do đó hai lựa chọn khác :-) – noodl

+0

THanks .... nó cũng làm việc cho tôi =) –

5

Trong điều khiển ứng dụng, xin vui lòng viết:

rescue_from (ActiveRecord::RecordNotFound) { |exception| handle_exception(exception, 404) } 

    protected 

    def handle_exception(ex, status) 
     render_error(ex, status) 
     logger.error ex 
    end 

    def render_error(ex, status) 
     @status_code = status 
     respond_to do |format| 
      format.html { render :template => "error", :status => status } 
      format.all { render :nothing => true, :status => status } 
     end 
    end 

Tạo một error.html.erb trang

<div class="page-header"> 
    <h1> 
    <%= t "errors.#{@status_code}.heading" %> 
    <small><%= t "errors.#{@status_code}.subheading" %></small> 
    </h1> 
</div> 
<p><%= t "errors.#{@status_code}.description" %></p> 
<% if defined? root_path %> 
    <%= link_to t(:return_to_home), root_path %> 
<% end %> 

và trong en.yml

en: 
    errors: 
    "404": 
     description: "The page you are looking for does not exist!" 
     heading: "Record not found" 
     subheading: "" 
+0

Lưu ý nhanh, error.htm.erb nên đi vào thư mục gốc của thư mục/views. –

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