2011-07-18 119 views
1

在我的应用中,用户和对话通过has_many:through关系绑定,关联表为conversation_users。Rails:无法销毁关联

如何从对话控制器中删除关联(用户离开对话)?我试过了:

def destroy_assoc 
    Conversation.find(params[:id]).conversation_users.find_by_user_id(current_user.id).destroy 
    redirect_to :back 
end 

但是我得到了undefined method 'eq' for nil:NilClass错误。以下是我打电话给该行动时的日志:

Processing by ConversationsController#destroy_assoc as HTML 
    Parameters: {"authenticity_token"=>"8AT1wx5MUVz1Gsqpp+u+z0vk8uj4F0mAWz5wpn+CjCU=", "username"=>"albert", "id"=>"14"} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 8 LIMIT 1 
    Conversation Load (0.2ms) SELECT "conversations".* FROM "conversations" WHERE "conversations"."id" = 14 LIMIT 1 
    ConversationUser Load (0.2ms) SELECT "conversation_users".* FROM "conversation_users" WHERE "conversation_users"."user_id" = 8 AND ("conversation_users".conversation_id = 14) LIMIT 1 
Completed 500 Internal Server Error in 109ms 

NoMethodError (undefined method 'eq' for nil:NilClass): 
    app/controllers/conversations_controller.rb:34:in `destroy_assoc' 

Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.9/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.0ms) 
Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.9/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (7.1ms) 
Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.9/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (12.9ms) 

找到记录,但销毁引发错误。我究竟做错了什么?

谢谢。

完整堆栈跟踪:

activesupport (3.0.9) lib/active_support/whiny_nil.rb:48:in `method_missing' 
activerecord (3.0.9) lib/active_record/persistence.rb:83:in `destroy' 
activerecord (3.0.9) lib/active_record/locking/optimistic.rb:110:in `destroy' 
activerecord (3.0.9) lib/active_record/callbacks.rb:256:in `destroy' 
activesupport (3.0.9) lib/active_support/callbacks.rb:414:in `_run_destroy_callbacks' 
activerecord (3.0.9) lib/active_record/callbacks.rb:256:in `destroy' 
activerecord (3.0.9) lib/active_record/transactions.rb:235:in `destroy' 
activerecord (3.0.9) lib/active_record/transactions.rb:292:in `with_transaction_returning_status' 
activerecord (3.0.9) lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction' 
activerecord (3.0.9) lib/active_record/transactions.rb:207:in `transaction' 
activerecord (3.0.9) lib/active_record/transactions.rb:290:in `with_transaction_returning_status' 
activerecord (3.0.9) lib/active_record/transactions.rb:235:in `destroy' 
app/controllers/conversations_controller.rb:34:in `destroy_assoc' 
actionpack (3.0.9) lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
actionpack (3.0.9) lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
actionpack (3.0.9) lib/abstract_controller/base.rb:150:in `process_action' 
actionpack (3.0.9) lib/action_controller/metal/rendering.rb:11:in `process_action' 
actionpack (3.0.9) lib/abstract_controller/callbacks.rb:18:in `process_action' 
activesupport (3.0.9) lib/active_support/callbacks.rb:441:in `_run__2060746170__process_action__2040097307__callbacks' 
activesupport (3.0.9) lib/active_support/callbacks.rb:410:in `send' 
activesupport (3.0.9) lib/active_support/callbacks.rb:410:in `_run_process_action_callbacks' 
activesupport (3.0.9) lib/active_support/callbacks.rb:94:in `send' 
activesupport (3.0.9) lib/active_support/callbacks.rb:94:in `run_callbacks' 
actionpack (3.0.9) lib/abstract_controller/callbacks.rb:17:in `process_action' 
actionpack (3.0.9) lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
activesupport (3.0.9) lib/active_support/notifications.rb:52:in `instrument' 
activesupport (3.0.9) lib/active_support/notifications/instrumenter.rb:21:in `instrument' 
activesupport (3.0.9) lib/active_support/notifications.rb:52:in `instrument' 
actionpack (3.0.9) lib/action_controller/metal/instrumentation.rb:29:in `process_action' 
actionpack (3.0.9) lib/action_controller/metal/rescue.rb:17:in `process_action' 
actionpack (3.0.9) lib/abstract_controller/base.rb:119:in `process' 
actionpack (3.0.9) lib/abstract_controller/rendering.rb:41:in `process' 
actionpack (3.0.9) lib/action_controller/metal.rb:138:in `dispatch' 
actionpack (3.0.9) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch' 
actionpack (3.0.9) lib/action_controller/metal.rb:178:in `action' 
actionpack (3.0.9) lib/action_dispatch/routing/route_set.rb:62:in `call' 
actionpack (3.0.9) lib/action_dispatch/routing/route_set.rb:62:in `dispatch' 
actionpack (3.0.9) lib/action_dispatch/routing/route_set.rb:27:in `call' 
rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in `call' 
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in `recognize' 
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:82:in `optimized_each' 
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in `recognize' 
rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in `call' 
actionpack (3.0.9) lib/action_dispatch/routing/route_set.rb:493:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/head.rb:14:in `call' 
rack (1.2.3) lib/rack/methodoverride.rb:24:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/flash.rb:182:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/cookies.rb:302:in `call' 
activerecord (3.0.9) lib/active_record/query_cache.rb:32:in `call' 
activerecord (3.0.9) lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache' 
activerecord (3.0.9) lib/active_record/query_cache.rb:12:in `cache' 
activerecord (3.0.9) lib/active_record/query_cache.rb:31:in `call' 
activerecord (3.0.9) lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/callbacks.rb:46:in `call' 
activesupport (3.0.9) lib/active_support/callbacks.rb:416:in `_run_call_callbacks' 
actionpack (3.0.9) lib/action_dispatch/middleware/callbacks.rb:44:in `call' 
rack (1.2.3) lib/rack/sendfile.rb:107:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/remote_ip.rb:48:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/show_exceptions.rb:47:in `call' 
railties (3.0.9) lib/rails/rack/logger.rb:13:in `call' 
rack (1.2.3) lib/rack/runtime.rb:17:in `call' 
activesupport (3.0.9) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
rack (1.2.3) lib/rack/lock.rb:11:in `call' 
rack (1.2.3) lib/rack/lock.rb:11:in `synchronize' 
rack (1.2.3) lib/rack/lock.rb:11:in `call' 
actionpack (3.0.9) lib/action_dispatch/middleware/static.rb:30:in `call' 
railties (3.0.9) lib/rails/application.rb:168:in `call' 
railties (3.0.9) lib/rails/application.rb:77:in `send' 
railties (3.0.9) lib/rails/application.rb:77:in `method_missing' 
railties (3.0.9) lib/rails/rack/log_tailer.rb:14:in `call' 
rack (1.2.3) lib/rack/content_length.rb:13:in `call' 
rack (1.2.3) lib/rack/handler/webrick.rb:52:in `service' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
rack (1.2.3) lib/rack/handler/webrick.rb:13:in `run' 
rack (1.2.3) lib/rack/server.rb:217:in `start' 
railties (3.0.9) lib/rails/commands/server.rb:65:in `start' 
railties (3.0.9) lib/rails/commands.rb:30 
railties (3.0.9) lib/rails/commands.rb:27:in `tap' 
railties (3.0.9) lib/rails/commands.rb:27 
script/rails:6:in `require' 
script/rails:6 
+0

您的错误可能会在destroy_assoc方法中更进一步。包括方法的其余部分(...)并指出哪些是第34行。同时发布您的rails版本。 – Thilo

+0

我更新了我的帖子。第34行对应于销毁电话。我正在使用rails 3.0.9 – alste

+0

您看到的堆栈跟踪不完整。 'eq'方法的出现使我认为有更多的模型。 – kain

回答

2

检查这个问题的答案:

undefined method `eq' for nil:NilClass with rails 3 and ruby enterprise on ubuntu hardy

如果在您的关联类没有ID字段,它不能作为一种模式处理,它出现。你是否使用a:has_and_belongs_to_many关联了一个没有主键的连接表id

+0

绝对,我刚刚计算出来,并准备发布答案:)我使用:has_many,:通过但我的连接表没有主键,所以销毁(和其他方法)无法工作。 我使用连接表中的主键进行重新迁移,并且它可以工作! 也相关:http://stackoverflow.com/questions/5085258/cant-destroy-record-in-many-to-many-relationship – alste

0

什么

@conversation = current_user.conversation_users.find_by_conversation_id(params[:id]) 
@conversation.destroy 

我猜

User has_many :conversation_users 
User has_many :conversations :through => :conversation_users 

运作的?我认为至少这是一个更清洁的方法,让AR做这项工作。

+0

感谢您的回答,但我只是想删除用户和对话之间的关系,而不是对话。 – alste

+0

对不起,我写了会话而不是join_model/association,正在修正 – kain

+0

mmm这会返回相同的错误,对于你的答案的第一行... – alste