【问题标题】:ruby on rails link_to delete method not workingruby on rails link_to 删除方法不起作用
【发布时间】:2012-10-21 10:52:46
【问题描述】:

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

<%= 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'

【问题讨论】:

  • 你能确认你的 Gemfile 中有 jquery-rails gem 吗?如果是,您是否还可以通过您的网络检查器确认它已发送到客户端浏览器。
  • 是的,所以当我创建 rails 项目时,我从 app.js 中删除了 //= 行,这导致了问题...谢谢!

标签: ruby-on-rails forms link-to


【解决方案1】:

你必须添加

//= require jquery
//= require jquery_ujs

在 javascripts/application.js 文件中

其次,签入布局文件,

javascript_include_tag "application"

是否包含?

希望对您有所帮助。

【讨论】:

  • 非常感谢。我错过了 //= 需要 jquery_ujs
  • 升级到 5.1 的Rails Guide 表示 rails_ujs 现在包含在 rails 中。但是,尽管您可以将其从 Gemfile 中删除,但您不能从此处将其删除。啊!发现这个丢失了几个小时。
【解决方案2】:

解决方案:

我在创建项目时从 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 .

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

【讨论】:

  • 需要明确的是,require jquery_ujs 似乎是重要的部分,以防不明显。
  • 添加回来 jquery_ujs 今天为我解决了完全相同的问题。 7年后,仍然是正确的答案。根据文档,jquery_ujs 的功能之一是它允许您“从超链接发出非 GET 请求”。没有这个,DELETE 就变成了 GET。
【解决方案3】:

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

<%= javascript_include_tag "application" %>

【讨论】:

  • 默认在布局文件中
  • 如果你用 ":defaults" 替换 "application" 会怎样。这有帮助吗?
  • 似乎也不起作用...我的问题不是警报,而是它没有删除帖子的事实...只是为了确保...
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

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

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

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

    让我们开始吧……

    在articles_controller.rb中添加destroy方法

    首先,我们将def destroy ... end添加到articles_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 工作。

    设置 routes.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 中称为:锚标签)中的链接结构,
      • '=>' 将链接结构指向 controller 标签,即 '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 外都已完成

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

    快乐编程

    【讨论】:

      【解决方案6】:

      这是 Rails 的方式:

      &lt;%= link_to 'Destroy', post, confirm: 'Are you sure?', method: :delete %&gt;

      如果帖子没有被删除,那么问题出在您的控制器上。您确定您已正确实施#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
      

      【讨论】:

      • 更新了我的答案。如果这也不起作用,您应该发布服务器日志。
      • 仍然无法正常工作...上面的 link_to 代码存在 2 个问题...首先确认没有显示,其次我不确定 link_to 是否达到了销毁操作...它只是似乎它进入了帖子本身...... - 编辑:在开发日志中也有任何奇怪的东西......它只是做了一个 GET
      • 嗯,它不应该做得到。你可以发布你的日志吗?你的 routes.rb 文件呢?
      • 更新了关于登录链接点击和路由的问题...删除了 format.json 但仍然没有运气
      【解决方案7】:

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

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

      docs所见

      如果您不想依赖 javascript,可以使用 button_to 代替 link_to

      【讨论】:

        【解决方案8】:

        确保参数后面没有空格

        def destroy
                @post = Post.find(params[:id])
                @post.destroy
                redirect_to posts_path, :notice => "Your post has been deleted successfully."
        end
        

        【讨论】:

          【解决方案9】:

          检查空格。

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

          curry-blog/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 的文件时,我发现在一个版本中只使用了选项卡,而另一个版本也使用了空白。可能是从教程中复制粘贴代码。因此,用制表符替换空白确实解决了问题。

          【讨论】:

            猜你喜欢
            • 2022-01-23
            • 1970-01-01
            • 2021-12-26
            • 2022-09-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-13
            相关资源
            最近更新 更多