2013-06-02 2 views
2

필자는 쓰고있는 sinatra 앱이 있습니다. 데이터베이스에 저장된 개별 패턴을 표시하는 페이지를 작성하려고합니다.NoMethodError, sinatra의 속성 호출

require 'dm-core' 
require 'dm-migrations' 

DataMapper.setup(:default, "sqlite://#{Dir.pwd}/development.db") 

class Pattern 
    include DataMapper::Resource 
    property :id, Serial 
    property :patt, String 
    property :sentence, String 
    property :descript, Text 
end 

DataMapper.finalize 

은/패턴/처리하는 경로 : 내가 만든 클래스 datamapper을 사용하여 ID가 ​​...

get '/pattern/:id' do 
    @patts = Pattern.get(params[:id]) 
    erb :pattern 
end 

그리고 내 pattern.erb 파일에

을 ...

<div class="span10"> 
    <h2><%= @patts.patt %></h2> 
    <p>Example: <%= @patts.sentence % @patts.patt %><p> 
    <p>Description: <%= @patts.descript %></p> 
</div> 

내가 오류는 ...

NoMethodError at /pattern/1 
undefined method `patt' for nil:NilClass 
file: pattern.erb location: block in singleton class line: 6 

무엇 내가 잘못하거나 잘못하고있는 것이 아닌가?

답변

-1

테이블이 비어있을 수 있습니다. 먼저 테이블에 레코드를 삽입하십시오.

당신은 다음과 같이 몇 가지 테스트 코드를 추가해야합니다 :

'/pattern/:id' do 

    puts params[:id] 

    @patts = Pattern.get(params[:id]) 

    puts @patts 

    erb :pattern 

end 
+0

아니요. 데이터가있어 문제없이 앱의 다른 섹션에 표시됩니다. –

+0

다음과 같이 몇 가지 테스트 코드를 추가해야합니다 : params [: id] @ putts = Pattern.get (params [: id]) puts @patts erb : pattern end ''' –

0

을 어떤 이유로, @patts = Pattern.get(params[:id])는, 대부분의 경우 당신에게 nil 을 제공하는 id 당신도이 있기 때문에 (기존 패턴 ID와 일치하지 않습니다 통과 패턴이 없거나 잘못된 URL을 치는 경우). 이유가 무엇이든간에 컨트롤러 또는 .erb에 다음 중 어떤 것을 사용하여 처리해야합니다.

if @patt 
    # Your code 
else 
    'No pattern by that id' # or something similar. 
end 

+0

그건 분명 좋은 생각 일 것이다. 그러나 나는 정확한 ID를 부르고 있음을 안다. URL은 패턴 ID에 대한 변수를 사용하여 생성됩니다. 본질적으로 "/pattern/#{pattern.id}"와는 별도로 알려진 패턴 ID가있는 URL을 수동으로 입력했으며 모두 똑같은 방식으로 반환됩니다. –

+0

@DavidKarasek'@ patts'에 대한 가치를 얻고 있습니까? @patts가 nil이 아닌 것으로 잘못되었습니다. 'p Pattern.all'을 문제의 라인 위에 놓으면 패턴을 기록합니까? 이 버그는 실제로 유효한 ID (보이는 것)를 유효한 항목 (문제 일 수는 있지만 가능하지 않아야 함)이있는 데이터베이스로 전달하는 경우 정말 이상합니다. – AlexQueue