2013-04-22 50 views
1

所以,我是Ruby/Sinatra的新手,做了一堆codecademy課程等等。我決定,直到我真正建立了一些東西,我不會真正理解一些核心概念。Sinatra待辦事項列表教程問題

我發現了一個tutorial用於在Sinatra中構建任務列表應用程序,並且在編輯和刪除功能之前一切都很好。我可以讀寫數據庫,但是每當我嘗試編輯或刪除時,都會直接跳到「找不到註釋」。

我自己弄不明白,所以我問了我的開發者朋友。當我給他發送代碼時,對他來說一切都很順利!我們嘗試了幾種不同的可能修復方法,但沒有結束。我甚至從這個人的github下載了代碼,以防萬一在我自己的代碼中出現了一個隨機錯誤,但無濟於事。

所以,我來這裏尋求一些幫助!爲什麼不能這樣工作!

說明:以下是一些代碼,我認爲這個問題可能存在。在edit.erb和delete.erb中,無論它是發給else語句還是發送給「not 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

除非您向我們發送一個簡短的實例來證明您的問題,否則您實際上會問我'我的口袋裏有什麼?編輯爲 – mcfinnigan 2013-04-22 15:21:40

+0

一些澄清,謝謝 – megafrogg 2013-04-22 15:31:53

回答

0

移動等航線上面刪除路由似乎爲我工作,這會建議在路線定義中的/:id-部分捕獲/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 
0

我不知道這是否仍是有趣的人,但一個簡單的

params[:id].to_i 

固定對我來說。