2011-08-13 13 views
2

私はRuby on Railsの初心者です。私は文字通り昨晩始まった。私はGetting Started with Railsのチュートリアルに従っていますが、いくつかの変更を行いました。投稿とコメントのあるブログではなく、プロジェクトにタスクが関連付けられている簡単なタスク追跡アプリケーションを作成しています。親モデルのメソッドは定義されていません

step #9 (Deleting Comments)まですべてがうまくいっていました。チュートリアルによると、私はcomment.postを呼び出すことによってコメントの親モデルを得ることができるはずです。私の場合はその類似点はtask.projectです。しかし、Railsが、私はtask.projectを持っている部分をレンダリングしようとすると、それはNoMethodErrorが発生します。次のように私のモデルがある

undefined method `project' for #<Task:0x7fb0011cf058> 

:レールコンソールを使用して

class Project < ActiveRecord::Base 
    validates :name, :presence => true 

    has_many :tasks, :dependent => :destroy 
end 

class Task < ActiveRecord::Base 
    validates :name, :presence => :true 

    belongs_to :project 
end 

を、私は私のことを決定タスクには、関連付けられたプロジェクトのIDを返すproject_idメソッドがあります。したがって、私は部分的にtask.projectの代わりにProject.find(task.project_id)を使用して問題を回避することができます。しかし、それは「間違っている」と思われ、私の2つのモデルの関係が何らかの形で壊れているかどうか疑問に思います。

ここでは何が起こっていますか?

更新:タスクモデルのvalidates行をコメントアウトすると、すべてのメソッドが正しく機能します。私はなぜそれが事実であるか理解していない。

更新2:これがわかりました。私は私の仕事モデルのvalidates行の単純なブール値の代わりにシンボル:trueを使用していました。私がスタックトレースにもっと注意を払っていたのであれば、はるかに早くそれを理解していたでしょう。どのような恥ずかしい間違い!

+0

コードは正常です。 – tybro0103

+0

タスクには名前属性がありますか?おそらく、あなたの 'schema.rb'の関連するチャンクも含めることができます。 –

答えて

0

あなたのコードは完璧に見えます。しかし、コンソールにしようとしていた場合は、最初に再読み込みしてからもう一度お試しください。

reload! 
task = Task.find(<record-id>) 
task.project 

これは動作するはずです。

+0

問題をデバッグしようとしている間にコンソールとRailsサーバーを閉じて再オープンしたため、原因とは思われません。私はあなたの提案をとにかく試みましたが、残念ながらそれは役に立たなかったのです。また、私のタスククラスは 'find'メソッドを持っていないようです...私の他の問題に関連しているかどうかは分かりません。 'irb(main):002:0> @task = Task.find(1) ArgumentError :: trueは無効なオプションです。 true、Hash、Regexp、Range、またはArray'を期待しています。 –

+0

@Mitch:別のクラスが "Task"と呼ばれていますか?コンソールで 'Task.superclass'を試して、何を言わなければならないかを見てください。 –

+0

@mu、私は 'Task.superclass'を試して、それは上記と同じ例外を投げました。スタックトレースでは、バリデーションについて何か気づいたので、モデルのバリデーション行をコメントアウトしました。すべてのメソッド( 'project'を含む)が動作します。なぜそれが起こっているのかまだ分かりません。この情報で元の質問を更新します。 –

関連する問題