2012-03-24 12 views
0

こんにちは、次のように私はレールで3つのファイルを持っている: "アプリ/コントローラ/ listings_controller.rb"のRails: "NoMethodError:#のための未定義のメソッド` constructKDTree」<クラス:0x00000104b1f760>" そこ

class ListingsController < ApplicationController 

    def index 
    #Construct kd Tree in memory 
    @tree = Listing.constructKDTree; 
    @tree.inspect 
    end 
に位置 1) APP /モデル/ listing.rbに位置

2)APP /モデル/ kd_tree.rbに位置

require 'kd_tree.rb' 
class Listing < ActiveRecord::Base 

    def constructKDTree 
    @contents = self.all 

    @kdTree = KDTree.new(@contents) 

    end 

3)

class KDTree 

    def initialize (db_listings) 
    'Initializing Tree' 

    end 

end 

は、今私はconstructKDTreeするための方法の実装をテストしようとしているので、私は私のレールコンソールに行き、次のコマンドを試してみました:

1.9.2-p290 :001 > @lc = ListingsController.new 
=> #<ListingsController:0x00000104f3e288 @_routes=nil, @_action_has_layout=true, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_request=nil, @_response=nil> 

1.9.2-p290 :002 > @lc.index 

しかし、私はこのエラーを取得する:私は

NoMethodError: undefined method `constructKDTree' for #<Class:0x00000104b1f760> 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/activerecord-3.2.1/lib/active_record/dynamic_matchers.rb:50:in `method_missing' 
from /Users/AM/Documents/RailsWS/cmdLineWS/Businesses/app/controllers/listings_controller.rb:20:in `index' 
from (irb):2 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands/console.rb:47:in `start' 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands/console.rb:8:in `start' 
from /Users/AM/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.2.1/lib/rails/commands.rb:41:in `<top (required)>' 
from script/rails:6:in `require' 
from script/rails:6:in `<main>' 

何をしています違う?

答えて

1

ListingのインスタンスメソッドとしてconstructKDTreeを定義しました。したがって、メソッドはクラスのインスタンスでのみ使用できますが、クラス自体は使用できません。

実際に達成したいことに応じて、このメソッドを次のコードのようにクラスメソッドにするか、またはListingクラスの新しいインスタンスを作成してそのインスタンスでメソッドを呼び出すことができます。

listing = Listing.new 
@tree = listing.constructKDTree 
+0

こんにちはありがとう:

class Listing < ActiveRecord::Base def self.constructKDTree @contents = self.all @kdTree = KDTree.new(@contents) end end 

は、しかし、あなたがそこに持っているコードを、あなたはおそらく後者を行うと、クラスの新しいインスタンスを作成したい時に見ています。私はJavaの背景から来てRubyを学びます。ですから、クラスレベルのメソッドはJavaの静的メソッドに似ていますか? – banditKing

+0

@banditKing:ええ、それはあなたが得ることができる最も近いです。 –

1

これはクラスメソッドの呼び出しです:

@tree = Listing.constructKDTree 

これはインスタンスメソッドの定義です:あなたはconstructKDTreeはあなたので、クラスメソッドになりたい

def constructKDTree 
    @contents = self.all 
    @kdTree = KDTree.new(@contents) 
end 

これを言う必要があります:

def self.constructKDTree 
    #... 
関連する問題