AssociationTypeMismatch expected Project got Project

Using RAILS_GEM_VERSION = '2.1.2'

Hello, I'm developing a plugin for another rails app. When I try to show the new form view I got this error:

ActiveRecord::AssociationTypeMismatch in Audit testsController#new

Project(#70348727429120) expected, got Project(#70348730882020)

RAILS_ROOT: /home/eyp/Aplicaciones/redmine-0.8.4 Application Trace | Framework Trace | Full Trace

vendor/rails/activerecord/lib/active_record/associations/ association_proxy.rb:210:in `raise_on_type_mismatch' vendor/rails/activerecord/lib/active_record/associations/ belongs_to_association.rb:22:in `replace' vendor/rails/activerecord/lib/active_record/associations.rb:1114:in `project=' vendor/plugins/redmine_audit_tests/app/controllers/ audit_tests_controller.rb:13:in `new' vendor/rails/actionpack/lib/action_controller/base.rb:1166:in `send' vendor/rails/actionpack/lib/action_controller/base.rb:1166:in `perform_action_without_filters' vendor/rails/actionpack/lib/action_controller/filters.rb:579:in `call_filters' vendor/rails/actionpack/lib/action_controller/filters.rb:572:in `perform_action_without_benchmark' vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' /usr/lib/ruby/1.8/benchmark.rb:293:in `measure' vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' vendor/rails/actionpack/lib/action_controller/rescue.rb:201:in `perform_action_without_caching' vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb: 13:in `perform_action' vendor/rails/activerecord/lib/active_record/connection_adapters/ abstract/query_cache.rb:33:in `cache' vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in `cache' vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb: 12:in `perform_action' vendor/rails/actionpack/lib/action_controller/base.rb:529:in `send' vendor/rails/actionpack/lib/action_controller/base.rb:529:in `process_without_filters' vendor/rails/actionpack/lib/action_controller/filters.rb:568:in `process_without_session_management_support' vendor/rails/actionpack/lib/action_controller/session_management.rb: 130:in `process' vendor/rails/actionpack/lib/action_controller/base.rb:389:in `process' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:149:in `handle_request' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:107:in `dispatch' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:104:in `synchronize' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:104:in `dispatch' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:120:in `dispatch_cgi' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:35:in `dispatch' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:76:in `process' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `synchronize' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `process' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in `process_client' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `each' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `process_client' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/ configurator.rb:282:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/ configurator.rb:281:in `each' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/ configurator.rb:281:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/command.rb: 212:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281 vendor/rails/activesupport/lib/active_support/dependencies.rb:503:in `load' vendor/rails/activesupport/lib/active_support/dependencies.rb:503:in `load' vendor/rails/activesupport/lib/active_support/dependencies.rb:355:in `new_constants_in' vendor/rails/activesupport/lib/active_support/dependencies.rb:503:in `load' vendor/rails/railties/lib/commands/servers/mongrel.rb:64 /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' vendor/rails/activesupport/lib/active_support/dependencies.rb:510:in `require' vendor/rails/activesupport/lib/active_support/dependencies.rb:355:in `new_constants_in' vendor/rails/activesupport/lib/active_support/dependencies.rb:510:in `require' vendor/rails/railties/lib/commands/server.rb:39 /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' script/server:3

vendor/rails/activerecord/lib/active_record/associations/ association_proxy.rb:210:in `raise_on_type_mismatch' vendor/rails/activerecord/lib/active_record/associations/ belongs_to_association.rb:22:in `replace' vendor/rails/activerecord/lib/active_record/associations.rb:1114:in `project=' vendor/plugins/redmine_audit_tests/app/controllers/ audit_tests_controller.rb:13:in `new' vendor/rails/actionpack/lib/action_controller/base.rb:1166:in `send' vendor/rails/actionpack/lib/action_controller/base.rb:1166:in `perform_action_without_filters' vendor/rails/actionpack/lib/action_controller/filters.rb:579:in `call_filters' vendor/rails/actionpack/lib/action_controller/filters.rb:572:in `perform_action_without_benchmark' vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' /usr/lib/ruby/1.8/benchmark.rb:293:in `measure' vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' vendor/rails/actionpack/lib/action_controller/rescue.rb:201:in `perform_action_without_caching' vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb: 13:in `perform_action' vendor/rails/activerecord/lib/active_record/connection_adapters/ abstract/query_cache.rb:33:in `cache' vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in `cache' vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb: 12:in `perform_action' vendor/rails/actionpack/lib/action_controller/base.rb:529:in `send' vendor/rails/actionpack/lib/action_controller/base.rb:529:in `process_without_filters' vendor/rails/actionpack/lib/action_controller/filters.rb:568:in `process_without_session_management_support' vendor/rails/actionpack/lib/action_controller/session_management.rb: 130:in `process' vendor/rails/actionpack/lib/action_controller/base.rb:389:in `process' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:149:in `handle_request' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:107:in `dispatch' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:104:in `synchronize' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:104:in `dispatch' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:120:in `dispatch_cgi' vendor/rails/actionpack/lib/action_controller/dispatcher.rb:35:in `dispatch' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:76:in `process' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `synchronize' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/rails.rb:74:in `process' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:159:in `process_client' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `each' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:158:in `process_client' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `initialize' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `new' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:285:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `initialize' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `new' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel.rb:268:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/ configurator.rb:282:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/ configurator.rb:281:in `each' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/ configurator.rb:281:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:128:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/lib/mongrel/command.rb: 212:in `run' /usr/lib64/ruby/gems/1.8/gems/mongrel-1.1.5/bin/mongrel_rails:281 vendor/rails/activesupport/lib/active_support/dependencies.rb:503:in `load' vendor/rails/activesupport/lib/active_support/dependencies.rb:503:in `load' vendor/rails/activesupport/lib/active_support/dependencies.rb:355:in `new_constants_in' vendor/rails/activesupport/lib/active_support/dependencies.rb:503:in `load' vendor/rails/railties/lib/commands/servers/mongrel.rb:64 /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' vendor/rails/activesupport/lib/active_support/dependencies.rb:510:in `require' vendor/rails/activesupport/lib/active_support/dependencies.rb:355:in `new_constants_in' vendor/rails/activesupport/lib/active_support/dependencies.rb:510:in `require' vendor/rails/railties/lib/commands/server.rb:39 /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' script/server:3

This is my controller:

class AuditTestsController < ApplicationController   unloadable

  before_filter :find_project

  def index     @audit_tests = AuditTest.find(:all)   end

  def new     @test_statuses = TestStatus.find(:all)     @audit_test = AuditTest.new     @audit_test.project = @project # <------- HERE I got the error     render :layout => !request.xhr?   end

  def create     if @audit_test.save         #attach_files(@issue, params[:attachments])         flash[:notice] = l(:notice_successful_create)         #Mailer.deliver_issue_add(@issue) if Setting.notified_events.include?('issue_added')         redirect_to :action => 'index'         return     end   end

  def update   end

  def destroy   end

  def show   end

  private   def find_project     @project = Project.find(params[:project_id])   end end

And this is the view:

<h2><%=l(:label_audit_test_plural)%></h2> <% html_title(l(:label_audit_test_plural)) %> <%= link_to l(:label_audit_test_new), :controller => "audit_tests", :action => "new", :project_id => @project %> <% if @audit_tests.empty? %> <p class="nodata"><%= l(:label_no_data) %></p> <% else %> <%= render :partial => 'audit_tests/list', :locals => {:audit_tests => @audit_tests, :query => @query} %> <% end %>

Project is something I not manage, is part of the main application, so I don't know if it changes at runtime.

I realized it doesn't happen in production environment ?¿

The root cause of your problem is that in development mode plugins are not reloaded between requests (at least that's the default) but your application classes are, so if your plugin model class holds a reference to one of your model classes then from the second request that reference now points at an old version of the class (which isn't equal to the fresh one, hence the slightly confusing message). One way around this is to have your plugin be reloaded on each request too, among other ways this can be done by removing it from ActiveSupport::Dependencies.load_once_paths (which was just Dependencies.load_once_paths in a previous version of rails - don't remember when the switch happened(

Fred

Thank you very much for that explanation.