1

オブザーバーの使用に関するいくつかの質問を見てcurrent_user、その1つが言ったことを実装しようとしましたが、機能しませんでした(ここを参照)。

チェックボックスがtrueとマークされているときに、オブザーバーによってエンジニアを作成しようとしています。エンジニアと軍隊はユーザーに属しています。

models / user.rb

class User < ActiveRecord::Base
  cattr_accessor :current 
  has_many :armies
  has_many :engineers
end

controllers / application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_time_zone, :set_current_user

  private

  def set_current_user
    User.current = current_user
  end
end

models / army_observer.rb

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

このコードでは、エラーが発生します。

undefined local variable or method `current_user' for #<ArmyObserver:0x4e68970>

その他の方法で?たぶん、Devise current_userメソッドと競合していますか?たぶんcurrent_user、コントローラーに保持する方が良いですか?もしそうなら、私はそれをどのように行いますか?

まだ学んでいる初心者に感謝します。

4

1 に答える 1

2

モデル(およびオブザーバー)レベルで使用できないという理由だけで、 Devisecurrent_userをクラスアクセサーに割り当てています。User.currentしたがって、そこで使用する代わりにcurrent_user、作成したクラスアクセサーを使用します。

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

編集:

ところで、これはスレッドセーフではないと思います。参照した投稿への回答の1つにリンクされているこのソリューションの最初の部分も実装しない限り、

于 2012-08-08T21:38:11.203 に答える