16

我正在尝试使用以下代码删除帖子:

<%= link_to 'Destroy', post, :method => :delete, :onclick => "return confirm('Are you sure you want to delete this post?')" %>

这不起作用......它只是将我重定向回帖子(posts/:id}

但是,如果我使用以下代码,它可以工作

<%= button_to 'Destroy', post, method: :delete, :onclick => "return confirm('Are you sure you want to delete this post?')" %>

在这种情况下是否有可能link_to表现得button_to如此?

编辑:销毁控制器功能

  def destroy
    @post = Post.find(params[:id])
    @post.destroy

    respond_to do |format|
      format.html { redirect_to posts_url }
      format.json { head :no_content }
    end
  end

当我单击销毁按钮时记录:

Started GET "/posts/14" for 127.0.0.1 at 2012-10-21 15:38:28 +0300
Processing by PostsController#show as HTML
  Parameters: {"id"=>"14"}
  Post Load (0.4ms)  SELECT `posts`.* FROM `posts` WHERE `posts`.`id` = 14 LIMIT 1
  Rendered posts/show.html.erb within layouts/application (0.6ms)
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
Completed 200 OK in 7ms (Views: 5.4ms | ActiveRecord: 0.8ms)
[2012-10-21 15:38:28] WARN  Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

路线:

  devise_for :users

  resources :users

  resources :posts

  match '/about' => 'about#index'

  # You can have the root of your site routed with "root"
  # just remember to delete public/index.html.
  root :to => 'index#index'

  # See how all your routes lay out with "rake routes"

  # This is a legacy wild controller route that's not recommended for RESTful applications.
  # Note: This route will make all actions in every controller accessible via GET requests.
  # match ':controller(/:action(/:id))(.:format)'
  match '*a', :to => 'error#routing'
4

9 回答 9

28

您必须添加

//= require jquery
//= require jquery_ujs

在 javascripts/application.js 文件中

第二,签入布局文件,

javascript_include_tag "application"

是否包含?

希望这有帮助。

于 2013-05-31T11:47:24.877 回答
15

解决方案:

当我创建项目时,我已经从 application.js 中注释掉了这个

// This is a manifest file that'll be compiled into application.js, which will include all the files
// listed below.
//
// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
//
//= require jquery
//= require jquery_ujs
//= require_tree .

所以重新添加它解决了问题

于 2012-10-21T14:36:25.740 回答
5

您是否在布局文件中包含了这一行?

<%= javascript_include_tag "application" %>
于 2012-10-21T11:03:19.820 回答
3

首先尝试检查日志中生成的 HTTP post 方法。如果它是“Get”,它不会在控制器中触发删除操作,无论路由等如何。它必须是一个 HTTP Delete 方法。

在最新版本的 Rails 中,包括 rails 6+,其中包括 jquery UJS 等不是一个选项/简单,您应该使用button_to 助手而不是 link_to。它创建一个删除 HTTP 帖子。

https://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to

于 2021-12-06T19:32:26.837 回答
2

没有 jQuery 也可以有一个工作的 link_to

我找到了在没有 jQuery 的情况下为 ruby​​ on rails 创建有效删除链接的最佳过程!我们需要处理三件事:

  1. 在articles_controller.rb中添加destroy 方法
  2. routes.rb设置
  3. LINK_TO标记

开始吧...

在articles_controller.rb 中添加destroy 方法

首先,我们将添加def destroy ... endarticles_controller.rb让我们打开:

# app/controllers/articles_controller.rb

  def destroy
    @article = Article.find(params[:id])
    @article.destroy
    params[:id] = nil
    flash[:notice] = "Art has been deleted"
    redirect_to :action => :index
  end

这里

  1. 在第一行中,我们调用了一个变量“@article”,它将从我们的数据库中找到并选择rails 控制台上文章的ID参数。然后,
  2. 在第 2 行中,@article 变量将在控制台中执行销毁命令。然后,
  3. 在第 3 行:id 参数将被删除和
  4. 在第 4 行,应用程序页面中会闪烁一条通知“艺术已被删除”,并且还会在控制台中显示,在数据库中没有找到任何内容。
  5. 在第 5 行,销毁过程完成后,我们将被重定向到文章索引页面。

这是发出破坏命令的主要因素。并使 link_to 工作。

设置路由.rb

但是等待 我们需要 2 个用于销毁页面的路由,它们是:

  1. GET 协议设置
  2. DELETE 协议设置

在路线中只需添加:

  resources :articles, except: [:destroy] # this will add all get request links automatically except destroy link

  post '/articles/new' => 'articles#create'
  post '/articles/:id' => 'articles#update'
  post '/articles/:id/edit' => 'articles#update' # this 3 lines are needed for other forms purpose

  # we need this 2 lines for our delete link_to setup
  delete 'articles/:id/delete' => 'articles#destroy', as: 'articles_delete'
  get '/articles/:id/delete' => 'articles#destroy'
  

这里

  1. 最后第二行是声明DELETE方法,

    • 'articles/:id/delete'将是每个帖子的帖子链接标记(称为:HTML 中的锚标记)中的链接结构,
    • '=>'将链接结构指向控制器标签,即'articles#destroy'
    • 然后我们通过将**设置为:'articles_delete'**来定义路径文本,我们将在link_to标签中将其用作:'articles_delete_path'或'articles_delete_url'。

然后

  1. 在最后一行,我们定义了删除链接的获取请求,这将为我们提供一个像“https://2haas.com/articles/1/delete”这样的工作链接,除了“/articles/1/destroy”,这意味着我们可以自定义我们从这 2 种方法设置中删除链接以及更多附加信息..

最后最甜蜜的删除输出

所需的 link_to 标记

我们可以使用它来获得正确的删除link_to标记,这将起作用。

<%= link_to 'Delete Article', articles_delete_path, method: :delete %>
<%= link_to 'Delete Article', articles_delete_url, method: :delete %>

<% obj.each do |post| %>
<%= link_to 'Delete Article', articles_delete_path(post), method: :delete %>
<% end %>

并且除了jQuery之外已经完成了

感谢您正确阅读此答案。!

快乐的节目

于 2021-05-26T18:45:24.063 回答
1

这是 Rails 的方式:

<%= link_to 'Destroy', post, confirm: 'Are you sure?', method: :delete %>

如果帖子没有被删除,那么问题出在您的控制器上。您确定您已正确实施该#destroy操作吗?您在服务器日志中得到的输出是什么?

更新:将您的操作更改为:

def destroy
  @post = Post.find(params[:id])

  respond_to do |format|
    if @post.destroy
      format.html { redirect_to posts_url }
      format.json { head :no_content }
    else
      format.html # do something here
      format.json { head :no_content }
    end
  end
end
于 2012-10-21T11:42:09.867 回答
1

如果使用link_towith:delete方法,您必须确保 javascript 处于活动状态:

请注意,如果用户禁用了 JavaScript,则请求将回退到使用 GET。

如文档中所见

如果您不想依赖于 javascript,您可以使用button_to而不是link_to.

于 2020-12-08T18:30:48.463 回答
0

确保参数后面没有空格

def destroy
        @post = Post.find(params[:id])
        @post.destroy
        redirect_to posts_path, :notice => "Your post has been deleted successfully."
end
于 2013-08-23T16:39:43.137 回答
0

检查空格。

我检查了这里的所有评论。所有包含的设置都正确。但是我注意到删除文章不起作用,而删除评论会起作用。在重写了一些代码并到处检查之后,我发现两个文件在编辑器中看起来完全相同,但是一个版本可以工作,一个版本不能工作!

咖喱博客/app/views/articles/index.html.erb:

<h1>Listing Articles</h1>
<%= link_to 'New article', new_article_path %>
<table>
  <tr>
    <th>Title</th>
    <th>Text</th>
    <th colspan="3"></th>
  </tr>
 
  <% @articles.each do |article| %>
    <tr>
      <td><%= article.title %></td>
      <td><%= article.text %></td>
      <td><%= link_to 'Show', article_path(article) %></td>
      <td><%= link_to 'Edit', edit_article_path(article) %></td>
      <td><%= link_to 'Delete', article_path(article),
              method: :delete,
              data: { confirm: 'Are you sure?' } %></td>        
    </tr>
  <% end %>
</table>

但是,在查看文件时,xxdiff我发现在一个版本中只使用了选项卡,而另一个版本也使用了空白。可能是从教程中复制粘贴代码。因此,用标签替换空白确实解决了问题。

于 2016-10-03T12:33:05.517 回答