所以,我是Ruby / Sinatra的新手,做了一堆代码学课程之类的东西。我决定直到我真正构建了一些东西,我不会真正理解一些核心概念。
我在Sinatra找到了一个用于构建待办事项列表应用程序的tutorial,一切都很好,直到我进入编辑和删除功能。我可以在数据库中读写数据,但每当我尝试编辑或删除时,它都会直接跳到“注意未找到”。
我自己无法弄清楚这一点,所以我问了我的一位开发者朋友。当我发给他代码的时候,一切都对他有用!我们尝试了几种不同的可能修复方法,但是没有尽头。我甚至从该人的github下载了代码,以防万一我自己的代码中出现随机错误,但无济于事。
所以,我来这里寻求帮助!为什么这不起作用!
澄清:这是一些代码,我认为这个问题可能存在。在edit.erb和delete.erb中,无论它发送到else语句并将其发送给“note not found”。它可以从数据库中正确读取,因为我的主页可以添加和显示注释。
recall.rb
get '/:id' do
@note = Note.get params[:id]
@title = "Edit note ##{params[:id]}"
erb :edit
end
put '/:id' do
n = Note.get params[:id]
n.content = params[:content]
n.complete = params[:complete] ? 1 : 0
n.updated_at = Time.now
n.save
redirect '/'
end
get '/:id/delete' do
@note = Note.get params[:id]
@title = "Confirm deletion of note ##{params[:id]}"
erb :delete
end
delete '/:id' do
n = Note.get params[:id]
n.destroy!
redirect '/'
end
edit.erb
<% if @note %>
<form action="/<%= @note.id %>" method="post" id="edit">
<input type="hidden" name="_method" value="put">
<textarea name="content"><%= @note.content %></textarea>
<input type="checkbox" name="complete" <%= "checked" if @note.complete %>>
<input type="submit">
</form>
<p><a href="/<%= @note.id %>/delete">Delete</a></p>
<% else %>
<p>Note not found.</p>
<% end %>
delete.erb
<% if @note %>
<p>Are you sure you want to delete the following note: <em>"<%= @note.content %>"</em>?</p>
<form action="/<%= @note.id %>" method="post">
<input type="hidden" name="_method" value="delete">
<input type="submit" value="Yes, Delete It!">
<a href="/<%= @note.id %>">Cancel</a>
</form>
<% else %>
<p>Note not found.</p>
<% end %>
答案 0 :(得分:0)
将删除路由移到其他路由之上似乎对我有用,这表明路由定义中的/:id
-part也会捕获/delete
部分。您可以使用Sinatra::Application.routes
查看生成的正则表达式。
这是一个最小的:
require 'rubygems'
require 'sinatra'
require 'dm-core'
require 'dm-migrations'
require 'dm-sweatshop'
# Models
DataMapper.setup(:default, 'sqlite::memory:')
class Note
include DataMapper::Resource
property :id, Serial
property :content, Text, :required => true
property :complete, Boolean, :default => false
property :created_at, DateTime, :default => lambda {Time.now}
property :updated_at, DateTime
before(:save) { attribute_set(:updated_at, Time.now) }
end
DataMapper.finalize.auto_migrate!
# Fixtures
Note.fix {{
:content => /\w+/.gen
}}
100.of { Note.gen }
# Routes
before("/:id") {|id| @note = Note.get id }
get("/:id/delete") {|id| @note = Note.get id; erb :delete }
get("/:id") { erb :edit }
put "/:id" do
@note.attributes = params["note"]
@note.save ? redirect(to("/")) : erb(:edit)
end
delete("/:id") { @note.destroy; redirect(to("/")) }
# Templates
template :layout do
'<!DOCTYPE html>
<html>
<body><%= yield %></body>
</html>'
end
template :edit do
'<% if @note %>
<form action="/<%= @note.id %>" method="POST">
<input type="hidden" name="_method" value="PUT">
<textarea name="note[content]"><%= @note.content %></textarea>
<input type="checkbox" name="note[complete]"
<%= @note.complete? && "checked" %> >
<input type="submit">
</form>
<p><a href="/<%= @note.id %>/delete">Delete</a></p>
<% else %>
<p>Note not found.</p>
<% end %>'
end
template :delete do
'<% if @note %>
<p>Are you sure you want to delete the following note:
<em>"<%= @note.content %>"</em>?</p>
<form action="/<%= @note.id %>" method="POST">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="Yes, Delete it!">
<a href="/<%= @note.id %>">Cancel</a>
</form>
<% else %>
<p>Note not found</p>
<% end %>'
end
答案 1 :(得分:0)
我不知道这是否仍然是有趣的人,而是一个简单的
params[:id].to_i
为我修好了。