2016-07-25 2 views
0

私はRailsのドキュメントを勉強しています。レールに似た連鎖したルビーメソッドの定義を定義する

Project#portfolio.nil?

これは私には奇妙に思えた:associations documentationの中で、彼らはこのように、それらの上にチェーンとメソッドの定義を指定します。それには、チェーンメソッドがあるインスタンスメソッド定義があるように見えます。たとえば、次のようにチェーンが実際のインスタンスメソッドの定義内で指定された場所:

class Project < ActiveRecord::Base 

    def portfolio.nil? 
    ... 
    end 
end 

私は前にこのように定義されているインスタンスメソッドを見たことがありません:Project#portfolio.nil?は次のようになりインスタンスメソッドを定義することが表示されます。私は真っ直ぐなルビーでそれを複製しようとしましたが、私はそれを動作させることができませんでした。

class Dog 
    def speak 
    puts "woof woof" 
    end 

    def speak.fetch 
    puts "go get the ball!" 
    end 
end 

ただし、これは機能しません。その後、私はDog.new.speak.fetchをしようとするだろう:それは仕事をした場合NameError

NameError: undefined local variable or method `speak' for Dog:Class

があります。私はそれが何を返すか分からない。多分それは返します:

=> woof woof! 
=> go get the ball! 

質問:それはどういうわけか、このような彼らの鎖でインスタンスメソッドの定義を定義することは可能であってもですか?そうでない場合:レールはどうしていますか? Project#portfolio.nil?を例として使用すると、Railsはどのようにして#portfolio.nil?を定義しますか?

答えて

3

これは、Railsのドキュメントにある単なるバグです(あるいは、誤解を招くような言葉にしましょう)。 http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.htmlから引用します。

The project class now has the following methods (and more) to ease the traversal and manipulation of its relationships: Project#portfolio, Project#portfolio=(portfolio), Project#portfolio.nil?

そのリストの3番目のエントリはnilは関係属性の有効な値であることを明らかに単なるヒントです。

(質問に対する答えは「いいえ」です。Rubyではメソッドのチェーンをdefに定義することはできません。)

+0

これは正解です。 –

0

の一つの基本的なことから始めましょう:あなたはdot notationを使用する場合

In Ruby, there are no primitives. Everything is objects. All have one common ancestor, the Object class.

だから、あなたがオブジェクトからメソッドを呼び出します。

nil?を使用すると、objectがnilであることを確認するメソッドを呼び出すことを意味します。あなたは、任意のオブジェクトからこのメソッドを呼び出すことができます。

Object.nil? # => false 

あなたのコードでは、あなたが団体Portofolioを持ってProjectモデルを持っています。

class Project < ActiveRecord::Base 
    belongs_to :portfolio 
end 

ドキュメントは言う:たとえば

Belongs_to: Specifies a one-to-one association with another class.

Methods will be added for retrieval and query for a single associated object, for which this object holds an id: association is a placeholder for the symbol passed as the name argument, so belongs_to :author would add among others author.nil?.

project = Project.first 
# this will get portfolio from database by foreign key 
puts project.portfolio 
# You can check that there is no records in database 
puts project.portfolio.nil? 

する言葉を閉じる:あなたは任意のメソッドを呼び出すとき、あなたには、いくつかのオブジェクトからそれを呼び出します。

+1

私が彼が言っていることはドキュメンテーションが__separateメソッド_として 'Project#portfolio.nil?'をリストしているということです。これは混乱しています。これはどのようにして1つのメソッド名になりますか? –

+0

はい:記載の通り:portfolio.nilはどのようにできますか? 1つのメソッド名ですか? – Neil

関連する問題