使用Ruby Sinatra,@tasks.each do | task |需要检查定义的?(task)
我正在用这个检查Sinatra。在索引方法中,它选择所有任务:使用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
@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="×" 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="×" title="Delete Task"