【问题标题】:Sinatra to-do list tutorial problemsSinatra 待办事项列表教程问题
【发布时间】:2014-04-30 03:44:45
【问题描述】:

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

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

我自己想不通,所以我问了我的一位开发者朋友。当我将代码发送给他时,对他来说一切都很好!我们尝试了几种不同的可能修复方法,但没有结束。我什至从那家伙的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 %>

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

【问题讨论】:

  • 除非您向我们发布一个简短的工作示例来证明您的问题,否则您实际上是在问我们“我的口袋里有什么?”
  • 编辑了一些澄清,谢谢

标签: ruby sinatra


【解决方案1】:

将删除路由移动到其他路由上方似乎对我有用,这表明路由定义中的/: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

【讨论】:

    【解决方案2】:

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

    params[:id].to_i
    

    帮我修好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      相关资源
      最近更新 更多