Html 添加逻辑以删除Sinatra中的方法

Html 添加逻辑以删除Sinatra中的方法,html,ruby,forms,controller,sinatra,Html,Ruby,Forms,Controller,Sinatra,我已经学习辛纳特拉几天了,所以我还是个新手。我只是创建了一个notes应用程序,并在应用程序中添加了删除功能 这是我的控制器: # 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

我已经学习辛纳特拉几天了,所以我还是个新手。我只是创建了一个notes应用程序,并在应用程序中添加了删除功能

这是我的控制器:

# 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
按钮,当您单击它时,会在提交时弹出一个窗口。这将简单地验证用户是否真的想要删除对象。但是,无论我点击什么,该项目都将被删除,并重定向到主页。我想添加逻辑,如果用户单击OK,应用程序将只删除我并将我重定向到主页。如果他们单击“取消”,则不会发生任何事情。如果您有任何建议或帮助,我们将不胜感激。

您看到这种行为是因为客户正在发布帖子,而不是删除

HTML表单只知道如何获取和发布。它们不能执行PUT或DELETE操作。使其工作的一种方法是使用AJAX调用

如果使用JQuery,可以将
方法
设置为删除。这是你的电话号码

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


编辑:根据Matt下面的评论,
\u方法
param取代了HTTP方法。即使这样做有效,我认为这不是一个好的做法。最好使用HTTP DELETE方法。

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

onsubmit="return confirm('Are you sure you want to delete the following note?')"
当前,
return
的返回值正在返回到事件处理程序,但处理程序本身正在返回
true
(至少不是
false


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

Sinatra使用,它检查隐藏的
\u方法输入,并将请求路由到应用程序中的相应方法。因此,在这种情况下,尽管浏览器使用
POST
,但Sinatra应用程序实际上会看到请求,就好像它是一个
DELETE
。很好的发现!这似乎就是问题所在。我不知道我必须归还它。