2013-06-02 29 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

相关问题