2013-01-16 53 views
0

當通過find_by_id仍然觸發的ActiveRecord :: RecordNotFound

@post = Post.find_by_id(params[:id]) 

我得到的ActiveRecord :: RecordNotFound查詢一個不存在的職位在我的控制器。但是,當我在軌道控制檯上做同樣的事情時,我得不到任何回覆。

我也試過find_by_id!(注意感嘆號)應該觸發404,但它仍然只是給我ActiveRecord :: RecordNotFound。

我發現寶石可能會導致此類問題(請參閱問題:Rails Find_by_id raises exception),所以我的問題是如何確定我使用哪種寶石可能導致相同的問題?

這是我的Gemfile

source 'https://rubygems.org' 

gem 'rails', '3.2.7' 
gem 'pg' 
gem 'jquery-rails' 
gem 'fancybox-rails', :git => 'https://github.com/sverigemeny/fancybox-rails' 
gem 'bcrypt-ruby', '~> 3.0.0' 
gem 'omniauth-twitter' 
gem 'omniauth-facebook' 
gem 'omniauth-google-oauth2' 
gem 'validates_email_format_of', :git => 'git://github.com/alexdunae/validates_email_format_of.git' 
gem 'cancan' 
gem 'thin' 
gem 'chronic' 
gem 'simple_form' 
gem 'twitter' 
gem 'kaminari' 

group :assets do 
    gem 'sass-rails' 
    gem 'compass-rails' 
    gem 'coffee-rails' 
    gem 'uglifier', '>= 1.0.3' 
end 

group :development do 
    gem 'quiet_assets' 
    gem 'faker' 
end 

我不知道怎樣才能只禁用一個接一個,直到我發現可能導致這個問題的寶石,因爲我很可能會觸發許多其他錯誤,由於寶石過程中的依賴關係。

任何人都知道我應該如何去做這件事?

更新 以下是完整的堆棧跟蹤:

ActiveRecord::RecordNotFound in PostsController#edit 

Couldn't find Post with id=123202 

activerecord (3.2.7) lib/active_record/relation/finder_methods.rb:341:in `find_one' 
activerecord (3.2.7) lib/active_record/relation/finder_methods.rb:312:in `find_with_ids' 
activerecord (3.2.7) lib/active_record/relation/finder_methods.rb:107:in `find' 
activerecord (3.2.7) lib/active_record/querying.rb:5:in `find' 
cancan (1.6.8) lib/cancan/model_adapters/abstract_adapter.rb:20:in `find' 
cancan (1.6.8) lib/cancan/controller_resource.rb:114:in `find_resource' 
cancan (1.6.8) lib/cancan/controller_resource.rb:68:in `load_resource_instance' 
cancan (1.6.8) lib/cancan/controller_resource.rb:32:in `load_resource' 
cancan (1.6.8) lib/cancan/controller_resource.rb:25:in `load_and_authorize_resource' 
cancan (1.6.8) lib/cancan/controller_resource.rb:10:in `block in add_before_filter' 
activesupport (3.2.7) lib/active_support/callbacks.rb:418:in `_run__4208450199150212965__process_action__1027836660135587880__callbacks' 
activesupport (3.2.7) lib/active_support/callbacks.rb:405:in `__run_callback' 
activesupport (3.2.7) lib/active_support/callbacks.rb:385:in `_run_process_action_callbacks' 
activesupport (3.2.7) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (3.2.7) lib/abstract_controller/callbacks.rb:17:in `process_action' 
actionpack (3.2.7) lib/action_controller/metal/rescue.rb:29:in `process_action' 
actionpack (3.2.7) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action' 
activesupport (3.2.7) lib/active_support/notifications.rb:123:in `block in instrument' 
activesupport (3.2.7) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
activesupport (3.2.7) lib/active_support/notifications.rb:123:in `instrument' 
actionpack (3.2.7) lib/action_controller/metal/instrumentation.rb:29:in `process_action' 
actionpack (3.2.7) lib/action_controller/metal/params_wrapper.rb:207:in `process_action' 
activerecord (3.2.7) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
actionpack (3.2.7) lib/abstract_controller/base.rb:121:in `process' 
actionpack (3.2.7) lib/abstract_controller/rendering.rb:45:in `process' 
actionpack (3.2.7) lib/action_controller/metal.rb:203:in `dispatch' 
actionpack (3.2.7) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch' 
actionpack (3.2.7) lib/action_controller/metal.rb:246:in `block in action' 
actionpack (3.2.7) lib/action_dispatch/routing/route_set.rb:73:in `call' 
actionpack (3.2.7) lib/action_dispatch/routing/route_set.rb:73:in `dispatch' 
actionpack (3.2.7) lib/action_dispatch/routing/route_set.rb:36:in `call' 
journey (1.0.4) lib/journey/router.rb:68:in `block in call' 
journey (1.0.4) lib/journey/router.rb:56:in `each' 
journey (1.0.4) lib/journey/router.rb:56:in `call' 
actionpack (3.2.7) lib/action_dispatch/routing/route_set.rb:600:in `call' 
omniauth (1.1.1) lib/omniauth/strategy.rb:177:in `call!' 
omniauth (1.1.1) lib/omniauth/strategy.rb:157:in `call' 
omniauth (1.1.1) lib/omniauth/strategy.rb:177:in `call!' 
omniauth (1.1.1) lib/omniauth/strategy.rb:157:in `call' 
omniauth (1.1.1) lib/omniauth/strategy.rb:177:in `call!' 
omniauth (1.1.1) lib/omniauth/strategy.rb:157:in `call' 
omniauth (1.1.1) lib/omniauth/builder.rb:48:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
rack (1.4.3) lib/rack/etag.rb:23:in `call' 
rack (1.4.3) lib/rack/conditionalget.rb:25:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/head.rb:14:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/flash.rb:242:in `call' 
rack (1.4.3) lib/rack/session/abstract/id.rb:210:in `context' 
rack (1.4.3) lib/rack/session/abstract/id.rb:205:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/cookies.rb:338:in `call' 
activerecord (3.2.7) lib/active_record/query_cache.rb:64:in `call' 
activerecord (3.2.7) lib/active_record/connection_adapters/abstract/connection_pool.rb:473:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call' 
activesupport (3.2.7) lib/active_support/callbacks.rb:405:in `_run__503554315877740465__call__403817388267166975__callbacks' 
activesupport (3.2.7) lib/active_support/callbacks.rb:405:in `__run_callback' 
activesupport (3.2.7) lib/active_support/callbacks.rb:385:in `_run_call_callbacks' 
activesupport (3.2.7) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (3.2.7) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/reloader.rb:65:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/remote_ip.rb:31:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call' 
railties (3.2.7) lib/rails/rack/logger.rb:26:in `call_app' 
railties (3.2.7) lib/rails/rack/logger.rb:16:in `call' 
quiet_assets (1.0.1) lib/quiet_assets.rb:20:in `call_with_quiet_assets' 
actionpack (3.2.7) lib/action_dispatch/middleware/request_id.rb:22:in `call' 
rack (1.4.3) lib/rack/methodoverride.rb:21:in `call' 
rack (1.4.3) lib/rack/runtime.rb:17:in `call' 
activesupport (3.2.7) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
rack (1.4.3) lib/rack/lock.rb:15:in `call' 
actionpack (3.2.7) lib/action_dispatch/middleware/static.rb:62:in `call' 
railties (3.2.7) lib/rails/engine.rb:479:in `call' 
railties (3.2.7) lib/rails/application.rb:220:in `call' 
rack (1.4.3) lib/rack/content_length.rb:14:in `call' 
railties (3.2.7) lib/rails/rack/log_tailer.rb:17:in `call' 
thin (1.5.0) lib/thin/connection.rb:81:in `block in pre_process' 
thin (1.5.0) lib/thin/connection.rb:79:in `catch' 
thin (1.5.0) lib/thin/connection.rb:79:in `pre_process' 
thin (1.5.0) lib/thin/connection.rb:54:in `process' 
thin (1.5.0) lib/thin/connection.rb:39:in `receive_data' 
eventmachine (1.0.0) lib/eventmachine.rb:187:in `run_machine' 
eventmachine (1.0.0) lib/eventmachine.rb:187:in `run' 
thin (1.5.0) lib/thin/backends/base.rb:63:in `start' 
thin (1.5.0) lib/thin/server.rb:159:in `start' 
rack (1.4.3) lib/rack/handler/thin.rb:13:in `run' 
rack (1.4.3) lib/rack/server.rb:268:in `start' 
railties (3.2.7) lib/rails/commands/server.rb:70:in `start' 
railties (3.2.7) lib/rails/commands.rb:55:in `block in <top (required)>' 
railties (3.2.7) lib/rails/commands.rb:50:in `tap' 
railties (3.2.7) lib/rails/commands.rb:50:in `<top (required)>' 
script/rails:6:in `require' 
script/rails:6:in `<main>' 
+0

你可以發佈堆棧跟蹤嗎?你確定它是'@post = Post.find_by_id(params [:id])'這行導致這個錯誤嗎?沒有感嘆號的'find_by_id'不應該引發異常,只有'find_by_id!'應該這樣做...... – drewinglis

+0

我在問題中添加了完整的堆棧跟蹤。 – tomthorgal

+0

確保PARAMS [:ID]其實不是零或空字符串 – Vineeth

回答

2

由於drewinglis指出,這是由慘慘造成的。

Cancan加載帖子以確定用戶是否有權對其執行任何操作。如果找不到帖子,它會用404,ActiveRecord :: RecordNotFound進行響應。

在這裏,瑞安進入這一點背後的推理:https://github.com/ryanb/cancan/issues/43他還建議從404恢復,如果這不是你需要的行爲。

0

drwesinglis和cheeseweasel是正確的,這是由CanCan造成的。我無法從https://github.com/ryanb/cancan/issues/43的帖子中獲得解決方案,所以我從我的控制器中刪除了load_and_authorize_resource,我現在正在檢查用戶是否有權完成操作。

我的控制器現在看起來是這樣的:

@post = Post.find_by_id(params[:id]) 
if @post 
    if can? :update, @post 
    ... 
    else 
    flash[:error] = 'You are not authorized to access this post.' 
    redirect_to root_url 
    end 
else 
    flash[:error] = 'This post doesn\'t exist.' 
    redirect_to root_url 
end 

我將在以後的開發週期更新我的代碼重定向到一個更好的404頁,但現在我只是顯示的消息。

相關問題