【问题标题】:NoMethodError, calling attribute in sinatraNoMethodError,在 sinatra 中调用属性
【发布时间】:2013-06-02 21:37:26
【问题描述】:

我正在编写一个 sinatra 应用程序。我正在尝试编写一个页面来显示存储在数据库中的各个模式。使用 datamapper 我创建了一个类:

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

处理 /pattern/: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

我没有做或做错了什么?

【问题讨论】:

    标签: ruby sinatra nomethoderror


    【解决方案1】:

    无论出于何种原因,@patts = Pattern.get(params[:id]) 给你nil 最有可能的是,您传递的 id 与现有模式 id 不匹配(因为要么没有模式,要么您打错了 url)。无论是什么原因,您都需要通过以下方式处理它:

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

    在您的控制器或您的 .erb 中。

    【讨论】:

    • 这绝对是一个实施的好主意。但是,我知道我正在调用正确的 ID。 URL 是通过使用模式 ID 的变量生成的。本质上是“/pattern/#{pattern.id}”,除此之外,我手动输入了具有已知模式 ID 的 URL,它们都返回相同。
    • @DavidKarasek 你得到@patts 的值了吗?出了点问题,以至于您的@patts 为零。如果您将p Pattern.all 放在违规行上方,它会记录您的模式吗?如果您确实将有效 id(看起来像)传递给具有有效条目的数据库(这可能是问题,但不太可能),这个错误真的很奇怪。
    【解决方案2】:

    这可能是因为您的表是空的。尝试先在表中插入一条记录。

    你应该像这样添加一些测试代码:

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

    【讨论】:

    • 不是。我有数据,可以毫无问题地显示在应用程序的其他部分。
    • 你应该像这样添加一些测试代码:'/pattern/:id' do puts params[:id] @patts = Pattern.get(params[:id]) puts @patts erb :pattern end
    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多