2010-12-01 18 views
1

私はまだ初心者だと思いますが、もう一度あなたの助けが必要です。私はhabtm協会で働いているが、私には問題がある。私はコンピュータに関する情報を入力するフォームを持っています。協会habtmはマシンとオペレーティングシステムの間にあります。ActiveRecord :: ReadOnlyRecord(ActiveRecord :: ReadOnlyRecord):更新中

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' 

感謝を。

+0

私は、作成時に結合テーブルの3倍の関係を作成することに注意してください。しかし、私は理由を知らない。私は付け加えました:uniq => trueですが、これが正しい方法であるとは分かりません... – Goueg83460

答えて

1

machines_operatingsystemsテーブルにmachine_idoperatingsystem_id以外の列がありますか?存在する場合、ActiveRecordはアソシエーションによって返されたレコードを読み取り専用としてマークします。

おそらく1つの原因は、結合表のタイムスタンプ列です。 machines_operatingsystemsを作成する移行にtimestampsへの呼び出しが含まれていると、それが問題の原因になっている可能性があります。