2010-02-25 21 views
33

Một người sử dụng chỉ có thể chỉnh sửa bài riêng của mình, vì vậy tôi sử dụng sau đây để kiểm tra xem người dùng có thể nhập các hình thức chỉnh sửa:cứu hộ từ ActiveRecord :: RecordNotFound trong Rails

def edit 
    @post = Load.find(:first, :conditions => { :user_id => session[:user_id], :id => params[:id]}) 
    rescue ActiveRecord::RecordNotFound 
    flash[:notice] = "Wrong post it" 
    redirect_to :action => 'index' 
    end 

Nhưng nó không phải đang làm việc, bất kỳ ý tưởng những gì tôi đang làm sai?

Trả lời

52

Nếu bạn muốn sử dụng câu lệnh giải cứu bạn cần phải sử dụng find() trong một cách thức mà nó đặt ra trường hợp ngoại lệ, đó là, đi qua các id bạn muốn tìm thấy.

def edit 
    @post = Load.scoped_by_user_id(session[:user_id]).find(params[:id]) 
rescue ActiveRecord::RecordNotFound 
    flash[:notice] = "Wrong post it" 
    redirect_to :action => 'index' 
end 
+0

Cảm ơn bạn @Simone Carletti đó là nó. – Adnan

6

Hóa ra bạn đang sử dụng giải cứu và tìm (: trước) không chính xác.

tìm: trả về đầu tiên nil nếu không có bản ghi khớp với điều kiện. Nó không làm tăng ActiveRecord :: RecordNotFound

thử

def edit 
    @post = Load.find(:first, :conditions => { :user_id => session[:user_id], :id => params[:id]}) 
    if @post.nil? 
    flash[:notice] = "Wrong post it" 
    redirect_to :action => 'index' 
    end 
end 
+0

Tôi nhận được "gọi là id cho con số không, mà nhầm lẫn sẽ là 4 - nếu bạn thực sự muốn id của con số không, sử dụng object_id" – Adnan

+1

Bạn đang sử dụng cứu hộ sai, nhưng vấn đề thực sự là tìm thấy: đầu tiên trả về nil nếu không tìm thấy bản ghi nào. Giải pháp được cập nhật để giải quyết gốc thực sự của vấn đề của bạn. – EmFi

+0

@DemitryT: Trong khi mã của bạn sẽ tạo ra cùng một kết quả. Trong trường hợp này, tôi đã chọn viết theo cách này, để giải quyết rõ ràng lỗi trong câu hỏi gốc. Cũng như vấn đề ưu tiên, tôi không thích sử dụng câu lệnh gán làm điều kiện. Tôi thấy sự kết hợp khó khăn hơn để duy trì và gỡ lỗi. – EmFi

34

Bạn cũng có thể sử dụng phương thức 'rescue_from. Để làm điều đó cho toàn bộ ứng dụng cùng một lúc!

class ApplicationController < ActionController::Base 
    rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found 

    def record_not_found 
    render 'record_not_found' # Assuming you have a template named 'record_not_found' 
    end 
end 
+0

Tại sao tôi cần 'true' ở cuối? Ngoài ra, những gì tôi có thể muốn bao gồm insted của '# ...'? –

+0

@AlexPopov Câu hỏi hay, không thể nhớ tại sao tôi lại đăng nó như thế này. Tôi không nghĩ rằng bạn cần nó .. –

+1

Ngoài ra 'render 'record_not_found'' ngụ ý rằng bạn phải có mẫu đó. Ngoài ra, bạn có thể sử dụng 'hiển thị văn bản: 'Một số thông điệp mô tả' '. –

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