0

次のファイル階層があります。

Lib> MyModule.rb Lib> MyModule.rb> MyClass.rb

MyModule.rbには、初期化メソッドがあります。

def initialize(variable, parameter)
  @variable = variable
  @parameter = parameter
end

ただし、クラスのインスタンスを作成しようとすると、エラーが発生します。

undefined method: set is not defined for nil

この再構築されたバージョンのinitializeで修正しようとしました。

def initialize(variable, parameter)
  @variable = variable
  @parameter = parameter
end

これにより、私が受け取ったエラーが軽減されます。ただし、ここで、HTML.erbファイルにクラスのインスタンスを作成します。

<%= MyModule::MyClass.new("string", 1) %>

ここで引数エラーが発生します:0の場合は2

誰かがこれを説明できますか?

要求に応じた詳細情報:

一般的に使用される要素の便利なラッパーとしてhtmlタグを作成するいくつかのメソッドを作成しようとしています。特に、これらはrailsのcontent_tagヘルパーメソッドを利用して新しいメソッドを作成します。最終的には、単純な<<演算子を使用してネストされたタグのサポートを追加する予定です。

Lib / tags.rb

module Tags
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::JavaScriptHelper
  include ActionView::Context

  def initialize(type, content, options, &block)
    @type = type
    @content = content
    @options = block_given? ? nil : options
    @block = block_given? ? block : nil
  end

  def show
    if @block.nil?
      content_tag(@type, @content, @options)
    else
      content_tag(@type, @content, @options) { @block.call }
    end
  end
end

これがモジュールの最低レベルです。これらは、実装するすべてのタグに共通になります。次に、Tagsフォルダー(Lib / tags / div.rb)にクラスがあります。

module Tags
  class DivTag
    def initialize(content, options, &block)
      super(:div, content, options, &block)
    end
  end
end

次に、私のテストファイルmain.rb(ローカルホストに移動するときにルーティングされるもの)で

そして、これは私が私のエラーを得るところです。

4

1 に答える 1

0

「def タグ」 - これは間違ったアプローチです。クラス タグを使用する必要があります ...

メソッドで「super」を呼び出すには、クラスを他のクラスから継承する必要があります。たとえば、class DivTag < Tags::Base def initialize super() # <- Tags::Base#initialize end end

デフォルトでは、「Object」クラスから継承するすべての新しいクラスと、Object#initialize は 0 個の引数を受け入れます。

「content_tag」ヘルパー (http://apidock.com/rails/ActionView/Helpers/TagHelper/content_tag) を使用しないのはなぜですか? それはほとんどあなたが望むものです

于 2012-04-09T03:21:46.783 に答える