2017-06-18 2 views
2

私のアプリケーションでメソッドを作成してコードを再因子化しようとしています。#<Array:0x00559ec6b7d918>の未定義メソッドをコードリファクタリングするコード

私は別の異なる多くのでは

def remove_lines_with_less_than_6_words 
    self.break_into_lines.reject { |a| a.split.size < 6 } 
end 

を入れてみました、私は別の関数で

.reject { |a| a.split.size < 6 } 

を入れたい

@clean_doc = @doc_broken_down_by_lines.reject { |a| a.split.size < 6 } 

:例えば、私は以下のものを持っています同じコントローラまたはアクティブレコードモデルに含まれる場所は

@clean_doc = @doc_broken_down_by_lines.remove_lines_with_less_than_6_words 

が、私はコードを配置する必要があり、エラー

undefined method `remove_lines_with_less_than_6_words' for #<Array:0x00559ec6b7d918> 

を取得しますか?コードが同じに見えるのに対して、なぜ私はエラーを取得しますか?ありがとう。

答えて

2

ここにコードを記載しますか?

def remove_lines_with_less_than_6_words(arr) 
    arr.reject { |a| a.split.size < 6 } 
end 

そして、このようにそれを使用します:しかし

@clean_doc = remove_lines_with_less_than_6_words(@doc_broken_down_by_lines) 

あなたはArrayのインスタンスメソッドとしてそれを使用するのではなく、メソッドのパラメータとして、あなたの配列を渡す必要がありますあなたのコントローラ(プライベートメソッド)にメソッドを追加し、パラメータとして渡さずに@doc_broken_down_by_linesを使うことができます(インスタンス変数として、クラス内のすべてのインスタンスメソッドで利用できるため)。このような

private 
def remove_lines_with_less_than_6_words 
    @doc_broken_down_by_lines.reject { |a| a.split.size < 6 } 
end 

そして、それを使用します。コードは同じ表示され、一方、

@clean_doc = remove_lines_with_less_than_6_words 

は、エラーが発生するのはなぜですかそれ

は、同一の表示されますが、それはまったく同じではありません。 Rubyでは、.でインスタンスメソッドを呼び出すことができるので、rejectArrayクラスのインスタンスメソッドであるため、my_array.rejectで呼び出すことができます。

しかし、あなたはあなた自身のメソッドを作成したら、それはArrayクラスで定義されていない、ので、それはArrayでインスタンスメソッドとして使用することはできません、それが定義されているクラスのインスタンスメソッドである(例えばMyControllerMyModelまたはそのメソッドを定義する場所を指定します)。

を< #Arrayための未定義のメソッド `my_custom_method」:

だからmy_array.my_custom_methodは、あなたが得ているエラーになりますやって...>

関連する問題