2013-06-02 70 views
2

我有一個sinatra應用程序,我正在寫。我正在嘗試編寫一個頁面來顯示存儲在數據庫中的單個模式。使用DataMapper的我創建了一個類: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 

處理/模式/路由: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

你應該添加一些這樣的測試代碼:''''/ pattern /:id'do puts params [:id] @patts = Pattern.get(params [:id])puts @patts erb:pattern end ''' –

0

無論出於何種原因,@patts = Pattern.get(params[:id])是給你nil 最有可能的id你通過不匹配現有的模式ID(因爲無論是沒有模式,或者你的網址錯誤)。不管什麼原因,你將需要處理與沿着線的東西:

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

無論是在您的控制器或您的.erb。

+0

這絕對是一個好主意來實現。但是,我知道我正在調用正確的ID。通過使用該模式的ID的變量生成URL。本質上是「/pattern/#{pattern.id}」,除此之外,我已經手動輸入了具有已知模式ID的URL,並且它們都返回相同。 –

+0

@DavidKarasek你得到了@ patts的值嗎?有些事情是錯誤的,你的@patts是零。如果你把'p Pattern.all'放在違規行的上面,它會記錄你的模式嗎?這個錯誤真的很奇怪,如果你確實傳遞了一個有效的id(看起來像)到一個有效的數據庫(這可能是問題,但應該不太可能)。 – AlexQueue

相關問題