【问题标题】:Add logic to delete method in Sinatra添加逻辑以删除 Sinatra 中的方法
【发布时间】:2015-07-08 18:16:34
【问题描述】:

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

【问题讨论】:

    标签: html ruby forms controller sinatra


    【解决方案1】:

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

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

    目前return 的返回值正在返回事件处理程序,但处理程序本身正在返回true(或至少不是false)。

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

    【讨论】:

    • 不错的发现!这似乎是问题所在。我不知道我必须退货。
    【解决方案2】:

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

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

    如果您使用的是 JQuery,您可以将 method 设置为 DELETE。这是reference

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

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

    【讨论】:

    • Sinatra 使用method override middleware,它检查隐藏的_method 输入并将请求路由到应用程序中的相应方法。因此,在这种情况下,尽管浏览器使用POST,但 Sinatra 应用程序实际上会将请求视为DELETE
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2015-05-14
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多