在 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
)。
(目前的建议似乎是避免这样的内联事件处理。)
我已经学习 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
)。
(目前的建议似乎是避免这样的内联事件处理。)