Sinatra待办事项列表教程问题

时间:2013-04-22 15:20:37

标签: ruby sinatra

所以,我是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 %>

2 个答案:

答案 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

为我修好了。