1

所以,我是 Ruby/Sinatra 的新手,上过很多 codecademy 课程之类的。我决定在我真正构建一些东西之前,我不会真正理解一些核心概念。

我找到了一个在 Sinatra 中构建待办事项列表应用程序的教程,一切都很好,直到我开始使用编辑和删除功能。我可以读写数据库,但每当我尝试编辑或删除时,它都会直接跳到“找不到注释”。

我自己想不通,所以我问了我的一个开发者朋友。当我将代码发送给他时,对他来说一切都很好!我们尝试了几种不同的可能修复方法,但没有结束。我什至从那家伙的github下载了代码,以防万一我自己的代码中的某个地方出现随机错误,但无济于事。

所以,我来这里寻求帮助!为什么这行不通!

澄清:这是一些代码,我认为问题可能出在哪里。在edit.erb 和delete.erb 中,无论它是什么都将转到else 语句并将我发送到“note not found”。它从数据库中正确读取,因为我的主页可以添加和显示注释。

召回.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

编辑.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 %>

删除.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 %>
4

2 回答 2

0

将 delete-route 移到其他路由之上似乎对我有用,这表明/:id路由定义中的 -part 也捕获了/delete-part。你可以看到生成的正则表达式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
于 2013-04-22T16:30:10.103 回答
0

我不知道这是否仍然是有趣的人,但一个简单的

params[:id].to_i

为我修好了。

于 2014-04-29T19:44:45.100 回答