2013-04-22 3 views
1

Итак, я новичок в Ruby/Sinatra, сделал кучу уроков codecademy и тому подобное. Я решил, что до тех пор, пока я не построю что-то, я бы не понял некоторые основные понятия.Sinatra to-do list tutorial problems

Я нашел 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

Если вы не разместите у нас короткий, рабочий пример, демонстрирующий вашу проблему, вы действительно спрашиваете нас: «Что у меня в карманах?» – mcfinnigan

+0

отредактировано для некоторого уточнения, спасибо – megafrogg

ответ

0

Перемещение удаления-маршрут над другими маршрутами, казалось, работал для меня, что предположил бы, что /:id -part в определении маршрута ловит /delete-part as wel л. Вы можете увидеть сгенерированные регулярные выражения с 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 

установил ее для меня.