2011-08-13 3 views
2

저는 Ruby on Rails의 절대 초보자입니다. 나는 지난 밤에 말 그대로 시작했다. 몇 가지 수정을 했는데도 Getting Started with Rails 튜토리얼을 따르고 있습니다. 게시물 및 댓글이 포함 된 블로그 대신 프로젝트와 관련된 작업이 포함 된 간단한 작업 추적 응용 프로그램을 만들고 있습니다.부모 모델 방법이 정의되지 않았습니다.

step #9 (Deleting Comments)까지 모든 것이 아주 잘 진행되고있었습니다. 튜토리얼에 따르면, 나는 comment.post을 호출하여 주석을위한 부모 모델을 얻을 수 있어야하는데,이 경우 내 경우에는 task.project이다. 다음과 같이

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

내 모델

은 다음과 같습니다 : 레일 내가 task.project있어하는 부분을 렌더링 할 때, 그것은이 NoMethodError 제기

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)을 사용하여 문제를 해결할 수 있습니다. 그것은 "틀린"것처럼 보이지만 내 두 모델 간의 관계가 어떻게 든 부숴 지는지 궁금하게 만듭니다.

여기 무슨 일 이니?

업데이트 : 작업 모델에서 validates 행을 주석 처리하면 모든 메소드가 제대로 작동합니다. 나는 그것이 왜 그런지 이해하지 못한다.

업데이트 2 : 알아 냈어. 내 작업 모델의 validates 행에있는 간단한 부울 값 대신에 :true 기호를 사용하고있었습니다. 처음에 스택 추적에 더 많은주의를 기울 였다면 훨씬 빨리 알았을 것입니다. 정말 당황 스럽네!

+0

코드가 정상적으로 보입니다. – tybro0103

+0

작업에 이름 속성이 있습니까? 어쩌면 당신은 당신의'schema.rb'의 관련 덩어리를 포함시킬 수도 있습니다. –

답변

0

코드가 완벽 해 보입니다. 콘솔에 넣으려고한다면 다시로드하고 다시 시도하십시오.

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

그래야 작동합니다.

+0

문제를 디버그하는 동안 콘솔과 레일 서버를 여러 번 닫았다가 다시 열었 기 때문에 그 원인이라고 생각하지 않습니다. 어쨌든 귀하의 제안을 시도했지만 불행히도 도움이되지 않았습니다. 그것은 또한 내 Task 클래스는'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' 포함)가 작동합니다. 왜 그런 일이 일어날 지 모르겠다. 나는 원래의 질문을이 정보로 갱신 할 것이다. –

관련 문제