ActiveRecord :: ReadOnlyRecord (ActiveRecord :: ReadOnlyRecord): во время обновления - PullRequest
1 голос
/ 01 декабря 2010

Я думаю, что я все еще новичок, но мне снова нужна ваша помощь.Пока я работаю с ассоциацией habtm, у меня есть проблема.У меня есть форма, где я ввожу информацию о компьютере.Habtm ассоциации между машиной и операционной системой.

class Machine < ActiveRecord::Base   
   ....
   has_and_belongs_to_many :operatingsystems, :join_table => "machines_operatingsystems", :readonly => false
   ....
end

class Operatingsystem < ActiveRecord::Base
   ....
   has_and_belongs_to_many :machines, :join_table => "machines_operatingsystems", :readonly => false
   ....
end

Я отображаю операционные системы с флажком.

Я изменил обновление контроллера машины

 def update
   params[:machine][:operatingsystem_ids] ||= []
   @machine = Machine.find(params[:id], :readonly => false)
   respond_to do |format|
   if @machine.update_attributes(params[:machine])
    flash[:notice] = 'Machine was successfully updated.'
    format.html { redirect_to(@machine) }
    format.xml  { head :ok }
   else
    format.html { render :action => "edit" }
    format.xml  { render :xml => @machine.errors, :status => :unprocessable_entity }
   end
 end
end

Но если я редактирую машину, например, не меняю имя и нажимаю на обновление, у меня появляется следующая ошибка:

ActiveRecord::ReadOnlyRecord (ActiveRecord::ReadOnlyRecord):
app/controllers/machines_controller.rb:72
app/controllers/machines_controller.rb:71:in `update'
passenger (2.2.15) lib/phusion_passenger/rack/request_handler.rb:92:in `process_request'
passenger (2.2.15) lib/phusion_passenger/abstract_request_handler.rb:207:in `main_loop'
passenger (2.2.15) lib/phusion_passenger/railz/application_spawner.rb:441:in `start_request_handler'
passenger (2.2.15) lib/phusion_passenger/railz/application_spawner.rb:381:in `handle_spawn_application'
passenger (2.2.15) lib/phusion_passenger/utils.rb:252:in `safe_fork'
passenger (2.2.15) lib/phusion_passenger/railz/application_spawner.rb:377:in `handle_spawn_application'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:352:in `__send__'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:163:in `start'
passenger (2.2.15) lib/phusion_passenger/railz/application_spawner.rb:222:in `start'
passenger (2.2.15) lib/phusion_passenger/spawn_manager.rb:253:in `spawn_rails_application'
passenger (2.2.15) lib/phusion_passenger/abstract_server_collection.rb:126:in `lookup_or_add'
passenger (2.2.15) lib/phusion_passenger/spawn_manager.rb:247:in `spawn_rails_application'
passenger (2.2.15) lib/phusion_passenger/abstract_server_collection.rb:80:in `synchronize'
passenger (2.2.15) lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'
passenger (2.2.15) lib/phusion_passenger/spawn_manager.rb:246:in `spawn_rails_application'
passenger (2.2.15) lib/phusion_passenger/spawn_manager.rb:145:in `spawn_application'
passenger (2.2.15) lib/phusion_passenger/spawn_manager.rb:278:in `handle_spawn_application'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:352:in `__send__'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:352:in `main_loop'
passenger (2.2.15) lib/phusion_passenger/abstract_server.rb:196:in `start_synchronously'

Заранее благодарим за помощь.

1 Ответ

1 голос
/ 12 марта 2011

Есть ли в вашей таблице machines_operatingsystems какие-либо столбцы, кроме machine_id и operatingsystem_id?Если это так, ActiveRecord помечает запись, возвращенную ассоциацией, как доступную только для чтения.

Одним из возможных виновников могут быть столбцы меток времени в таблице соединений.Если миграция, которая создает machines_operatingsystems, включает в себя вызов timestamps, это может быть источником вашей проблемы.

...