2013-01-02 2 views
0

항목이 7 일 이상 경과했는지 여부를 확인하기 위해 (지금은) 페이지가로드 될 때마다 필터를 실행하기 전에이 기능을 사용하고 싶습니다. 그것의 속성을 업데이트합니다.레일 - before_filter를 사용하여 메소드 실행

응용 프로그램 컨트롤러에 before_filter :update_it이 있습니다.

def update_it 
    @books = Book.all 
    @books.each do |book| 
    book.update_queue 
    end 
end 

그런 다음 update_queue이 책 모델에 정의되어 update_it는 같은 컨트롤러에 그 아래에 정의되어 있습니다. 다음은이 관련된 모델의 모든입니다 :

scope :my_books, lambda {|user_id| 
    {:conditions => {:user_id => user_id}} 
    } 

    scope :reading_books, lambda { 
    {:conditions => {:reading => 1}} 
    } 

    scope :latest_first, lambda { 
    {:order => "created_at DESC"} 
    } 


    def move_from_queue_to_reading 
    self.update_attributes(:queued => false, :reading => 1); 
    end 

    def move_from_reading_to_list 
    self.update_attributes(:reading => 0); 
    end 

    def update_queue 
    days_gone = (Date.today - Date.parse(Book.where(:reading => 1).last.created_at.to_s)).to_i 

    # If been 7 days since last 'currently reading' book created 
    if days_gone >= 7 

     # If there's a queued book, move it to 'currently reading' 
     if Book.my_books(user_id).where(:queued => true) 
      new_book = Book.my_books(user_id).latest_first.where(:queued => true).last 
      new_book.move_from_queue_to_reading 
      currently_reading = Book.my_books(user_id).reading_books.last 
      currently_reading.move_from_reading_to_list 

     # Otherwise, create a new one 
     else 
      Book.my_books(user_id).create(:title => "Sample book", :reading => 1) 

     end 
    end 
    end 

나의 관계는 그 사용자와 사용자 has_many 책 belongs_to 책. 나는 사용자 쇼보기를 통해보기에 이러한 책을 보여 주지만 중요하지는 않습니다.

그래서 계속 오류가 발생하는 것은 move_from_queue_to_readingmove_from_reading_to_list은 정의되지 않은 방법입니다. 어떻게 이럴 수있어? 나는 그것들을 명확하게 정의하고있다. 나는 정말 실망스럽고 내가 잘못하고있는 것에 대한 통찰력을 크게 고맙게 생각할 것입니다. 여기 초보자를, 그래서 어떤 구조적인 비판은 좋은 것입니다 :)

편집

정확한 오류 메시지 내가 얻을 다음과 같이 스택 추적은 다음과 같습니다

NoMethodError in UsersController#show 
undefined method `move_from_queue_to_reading' for nil:NilClass 

app/models/book.rb:41:in `update_queue' 
app/controllers/application_controller.rb:22:in `block in update_it' 
app/controllers/application_controller.rb:21:in `each' 
app/controllers/application_controller.rb:21:in `update_it' 
+0

당신은'new_book'와'currently_reading' 변수는'nil' 아니라는 것을 확인 할 수 있나요? – PinnyM

+0

'protected' 또는'private' 섹션에서 찾을 수없는 두 가지 방법이 있습니까? –

+0

@PinnyM'''new_book'''은 콘솔에서''''new_book = Book.where (: queued => true) .last'''를 실행하면 nill이 아닙니다. 책을 반환합니다. '''currently_reading'''과 같은 것. –

답변

1

나는 의심 반환 된 컬렉션은 빈 배열입니다 (테스트 할 때 여전히 '진실'입니다). 따라서 .last을 호출하면 new_bookcurrently_reading 로컬 변수에 nil이 반환됩니다. 변경 시도 :

if Book.my_books(user_id).where(:queued => true) 

에 :

if Book.my_books(user_id).where(:queued => true).exists? 

currently_reading을 찾을 때 또한,이 범위를 수정한다. 이로 인해 잠재적으로 쿼리가 결과를 반환하지 않을 수 있습니다. 변경 :

currently_reading.move_from_reading_to_list 

로는 :

currently_reading.move_from_reading_to_list if currently_reading 
+0

답변 해 주셔서 감사합니다. 그래도 아직 정의되지 않은 메소드를 얻고 있습니다. –

+0

스택 추적을 사용하여 정확한 오류 메시지를 게시 할 수 있습니까? – PinnyM

+0

업데이트 된 질문보기 –