0

すべてのアクションでインスタンス変数を設定するメソッドを ApplicationController ファイルに作成しました。

def self.set_body_id(id)
    print "This is test"
    self.instance_variable_set(:@body_id, id)
end

このメソッドを別のコントローラーで呼び出すと、次のようになります。

class HostingController < ApplicationController
    set_body_id "Test"

    def index
    end
end

.. そして、何も起こりません。@body_id変数はビューで使用できませんでした。したがって、Railsコンソールを実行して、この関数が実行されるかどうかを確認すると、予想どおり、 aをThis is test呼び出すと出力に文字列が表示されますHostingController.newが、まだ@body_id定義されていません。

またself、 a から削除し、self.variable_instance_setこの行を a@body_id = "Test"に置き換えても、これはまだ機能しませんでした。私は何を間違っていますか?

編集:

どこで間違えたかがわかります。クラスインスタンスを作成する前に、インスタンス変数を設定しようとしています。self.set_body_idクラスに参加する必要があるようですが、initializeその方法はまだわかりません。

4

3 に答える 3

0

これはあなたを助けるはずです

 class ApplicationController < ActionController::Base

    protected
      def set_body(id)
        ApplicationController.get_id(id)
      end

     def self.get_id(id)
      self.class_variable_set(:@@body, id)
      end
   end

あなたのホスティングコントローラー

class HostingController < ApplicationController
   before_filter :set_body

protected

  def set_body
      @body = super(params[:id])
  end
end

set_bodyから設定している@bodyインスタンス変数は、すべてのメソッドでアクセスできる必要があります。調べながらやってみる

于 2012-09-05T10:50:12.477 に答える
0
class ApplicationController < ActionController::Base
    protect_from_forgery

    def self.set_body_id(id)
        self.class_variable_set(:@@body_id, id)
    end

    before_filter :set_body_attributes

    private

    def set_body_attributes
        @body_id = self.class.class_variable_get(:@@body_id)
    end
end

@apneadiving のヒントのおかげで理解できました:)

于 2012-09-05T09:38:47.740 に答える
0

次のように書く必要があると思います。

def set_body_id(id)
  instance_variable_set("@body_id", id)
end

更新: インスタンス メソッドである必要があるクラス メソッドを使用していることがわかりました。コードを更新しました。

于 2012-09-05T09:15:56.433 に答える