在 Sinatra 中添加删除方法的逻辑

Add logic to delete method in Sinatra

我已经学习 Sinatra 几天了,所以我还是很新。我只是创建了一个笔记应用程序,并在应用程序中添加了删除功能。

这是我的控制器:

# Will display title of all notes
get '/' do
  @notes = Note.all
  erb :index
end

# Will display content within selected note
get '/:id' do
  @note = Note.where(id: params[:id]).first
  erb :note_description
end

# Will delete item from notes.
delete '/:id' do
  Note.delete(params[:id])

  redirect '/'
end

这是我对 html/erb 的看法:

<div class="container">
  <p><a href="/">Return to Notes</a></p>

  <h1><%= @note.title %></h1>
  <p><%= @note.content %></p>


  <form onsubmit="confirm('Are you sure you want to delete the following note?')" action="/<%= @note.id %>" method="POST">
    <input type="hidden" name="_method" value="DELETE">
    <button type="submit">Delete</button>
  </form>

</div>

如您所见,我创建了一个 delete 按钮,单击它时会弹出一个提交按钮。这将简单地验证用户是否真的想要删除该对象。但是,无论我单击什么,该项目都会被删除,我将被重定向到主页。我想添加逻辑,如果用户单击确定,应用程序只会删除并将我重定向到主页。如果他们单击取消,则不会发生任何事情。任何建议或帮助将不胜感激。

您看到此行为是因为客户端正在执行 POST,而不是 DELETE。

HTML 表单只知道如何做 GET 和 POST。他们不能做 PUT 或 DELETE。使它起作用的一种方法是使用 AJAX 调用。

如果您正在使用 JQuery,您可以将 method 设置为删除。这是 reference.

例如,您需要创建 URL: /1。你需要处理成功和失败的案例。也许成功设置位置,失败显示错误。

编辑:根据马特在下面的评论,_method 参数替换了 HTTP 方法。尽管这可行,但我认为这不是一个好的做法。最好使用 HTTP DELETE 方法。

您需要从事件处理程序本身 return,因此该属性将如下所示:

onsubmit="return confirm('Are you sure you want to delete the following note?')"

当前 return 的 return 值正在 returned 事件处理程序,但处理程序本身是 returning true(或者至少不是 false)。

(目前的建议似乎是避免这样的内联事件处理。)