使用Ruby Sinatra,@tasks.each do | task |需要检查定义的?(task)

使用Ruby Sinatra,@tasks.each do | task |需要检查定义的?(task),ruby,sinatra,slim-lang,Ruby,Sinatra,Slim Lang,我正在用这个检查Sinatra。在索引方法中,它选择所有任务: @tasks = Task.all 在索引视图中,它迭代所有这些任务: - @tasks.each do |task| 并且,在任务部分,它会显示名称: = task.name 正如预期的那样,任务部分会在整个任务类中进行迭代,但它会继续执行最后一个任务,并最终失败: NameError - undefined local variable or method `task' for #<Sinatra::Applicat

我正在用这个检查Sinatra。在索引方法中,它选择所有任务:

@tasks = Task.all
在索引视图中,它迭代所有这些任务:

- @tasks.each do |task|
并且,在任务部分,它会显示名称:

= task.name
正如预期的那样,任务部分会在整个任务类中进行迭代,但它会继续执行最后一个任务,并最终失败:

NameError - undefined local variable or method `task' for #<Sinatra::Application:0x4e0db18>:
这对我来说是出乎意料的。有人能解释一下吗

Main.rb:

# https://www.sitepoint.com/just-do-it-learn-sinatra-i/
require 'sinatra'
require 'slim'
require 'data_mapper'
require 'dm-sqlite-adapter'

DataMapper.setup(:default, ENV['DATABASE_URL'] || 'sqlite3:development.db')
class Task
  include DataMapper::Resource
  property :id,           Serial
  property :name,         String, :required => true
  property :completed_at, DateTime
end
DataMapper.finalize
DataMapper.auto_upgrade!

get '/' do
  @tasks = Task.all
  slim :index
end

post '/' do
  Task.create  params[:task]
  redirect to('/')
end

get '/:task' do
  @task = params[:task].split('-').join(' ').capitalize
  slim :task
end

delete '/task/:id' do
  Task.get(params[:id]).destroy
  redirect to('/')
end

put '/task/:id' do
  task = Task.get params[:id]
  task.completed_at = task.completed_at.nil? ? Time.now : nil
  task.save
  redirect to('/')
end
index.slim:

form action="/" method="POST"
  input type="text" name="task[name]"
  input.button type="submit" value="New Task >>"

h2 My Tasks

ul.tasks
  - @tasks.each do |task|
    - if defined?(task)
      == slim(:task, locals: { task: task })
task.slim:

li.task
  - if defined?(task)
    = task.name
    form.update action="/task/#{task.id}" method="POST"
      input type="hidden" name="_method" value="PUT"
      / Logic is bad here and will be fixed.
      - if task.completed_at.nil?
        input type="submit" value="  " title="Complete Task"
      - else
        input type="submit" value="✓" title="Uncomplete Task"
    form.delete action="/task/#{task.id}" method="POST"
      input type="hidden" name="_method" value="DELETE"
      input type="submit" value="&times;" title="Delete Task"

我还原了代码,并尝试重新创建问题以获取stacktrace。它没有再发生。我只能推测数据库中有一个错误,因此它包含一个无效条目,从而导致问题。

我还原了代码,并试图重新创建问题以获得stacktrace。它没有再发生。我只能推测数据库中有一个错误,它包含一个无效的条目,从而导致了问题。

哪一行产生了错误?你能包括回溯吗?您还可以提供产生错误的代码吗(您说使用
defined?
修复它,因此此代码不会产生错误)?@matt我在task.slim中列出的错误发生在“=task.name”行中。我在index.slim和task.slim中添加了代码“-if defined?(task)”,以防止出现错误。我没有保存回溯,正在继续学习教程。可以使用此处的代码重新创建它。谢谢。哪一行产生了错误?你能包括回溯吗?您还可以提供产生错误的代码吗(您说使用
defined?
修复它,因此此代码不会产生错误)?@matt我在task.slim中列出的错误发生在“=task.name”行中。我在index.slim和task.slim中添加了代码“-if defined?(task)”,以防止出现错误。我没有保存回溯,正在继续学习教程。可以使用此处的代码重新创建它。谢谢
li.task
  - if defined?(task)
    = task.name
    form.update action="/task/#{task.id}" method="POST"
      input type="hidden" name="_method" value="PUT"
      / Logic is bad here and will be fixed.
      - if task.completed_at.nil?
        input type="submit" value="  " title="Complete Task"
      - else
        input type="submit" value="✓" title="Uncomplete Task"
    form.delete action="/task/#{task.id}" method="POST"
      input type="hidden" name="_method" value="DELETE"
      input type="submit" value="&times;" title="Delete Task"