0

陸軍フォームのチェックボックスでエンジニアを作成しようとしていますが、作成されません。チェックボックスの名前は、siege私のArmyモデルの一部です。

models / army.rb

class Army < ActiveRecord::Base
 attr_accessible :siege
 attr_reader :siege
 validates_inclusion_of :siege, :in => [true, false]
 has_many :engineers

 def siege=(string_value)
   @siege = (string_value == '1')
 end
end

models / engineer.rb

class Engineer < ActiveRecord::Base
  belongs_to :user
  belongs_to :army
end

armies / new.html.erb

<%= form_for @army do |f| %>
  <%= f.check_box :siege %>
  <%= f.submit "Create Army" %>
<% end %>

controllers / armies_controller.rb

def new
  @army = Army.new
end

def create
  @army = current_user.armies.build(params[:army])
    if @army.save
      redirect_to new_army_path
    else
      render :new
    end
  end
end

models / army_observer.rb

class ArmyObserver < ActiveRecord::Observer
  def after_save(army)
    if army.siege
      Engineer.new({ :user_id => current_user.id, :army_id => :army_id })
    end
  end
end

軍隊は作成されますが、エンジニアは作成されません。これを有効にするには、コードで何を修正する必要がありますか?

4

1 に答える 1

1

あなたはそれを初期化した後にレコードを保存していません:)

.newレコードを作成するだけでは保存されません。

オブザーバーnewcreate!

Engineer.new({ :user_id => current_user.id, :army_id => :army_id })

Engineer.create({ :user_id => current_user.id, :army_id => :army_id })

または、レコードを作成した後に保存します

engineer= Engineer.new({ :user_id => current_user.id, :army_id => :army_id }) 
engneer.save

また、オブザーバーを構成に登録して、アクティビティをリッスンさせる必要があります

http://guides.rubyonrails.org/active_record_validations_callbacks.html#registering-observers

于 2012-08-08T10:23:10.563 に答える