【问题标题】:Rails 4 link_to Destroy not working in Getting Started tutorialRails 4 link_to Destroy 在入门教程中不起作用
【发布时间】:2013-08-11 20:54:39
【问题描述】:

我正在完成入门教程(创建博客),但 link_to Destroy 无法正常运行。在终端中,它总是将其解释为#SHOW。

在阅读类似问题时,我了解到必须将 Delete 转换为 POST 以便浏览器对其进行解释。这似乎没有发生。

我在 Lynda.com Rails 课程中使用 Destroy 时也遇到了同样的问题,所以它让我相信这是我的开发环境中的问题。我正在为 MacBook Pro Lion 上的 HTTP 服务器使用 Rails 4、Ruby 2.00p274、MySQL、WEBrick。

在选择 Destroy 时的终端会话中:

Started GET "/posts/4" for 127.0.0.1 at 2013-08-09 13:45:20 -0600
Processing by PostsController#show as HTML
  Parameters: {"id"=>"4"}
  Post Load (0.6ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT 1  [["id", "4"]]
  Rendered posts/show.html.erb within layouts/application (0.4ms)
Completed 200 OK in 13ms (Views: 8.6ms | ActiveRecord: 0.6ms)

在ports-controller.rb中:

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

    redirect_to action: :index
end

在 index.html.erb 中:

<% @posts.each do |post| %>
  <tr>
    <td><%= post.title %></td>
     <td><%= post.text %></td>
    <td><%= link_to 'Show', post %></td>
    <td><%= link_to 'Edit', edit_post_path(post) %></td>
    <td><%= link_to 'Destroy',  { action: :destroy, id: post.id }, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
 <% end %>

在 routes.rb 中

Blog::Application.routes.draw do
   resources :posts do
     resources :comments
   end
  root to: 'welcome#index'
end

【问题讨论】:

  • 显示你的 layouts/application.html.erb 和 app/assets/application.js。
  • 您必须使用默认包含在新 Rails 应用程序中的 jquery_ujs 库来使 :delete 方法按预期发送到端点。
  • @ssorallen:将其发布为答案!我遇到了完全相同的问题,给出的答案并没有帮助,但是将 jquery_ujs 包含到文件application.js 中确实为我解决了这个问题。迁移时可能只是个问题...

标签: ruby-on-rails


【解决方案1】:

Started GET "/posts/4" for 127.0.0.1 at 2013-08-09 13:45:20 -0600

这就是问题所在。即使您在链接中使用了method: delete,删除链接也使用 GET http 动词。

Check out the following SO thread

【讨论】:

  • 遇到了同样的问题,这个帮我解决了,谢谢!
【解决方案2】:

试试这个

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

【讨论】:

  • 您希望这有什么帮助?
  • 正如我所说 - 试试吧!我没有说这是 100% 的答案。从给出的信息很难得出结论。
  • 也许作者应该检查他的浏览器。我认为 JavaScript 已关闭。或切换到另一个。
  • 但是这样写绝对是一种不好的做法,因为它健壮且容易出错,难以调试和维护。
  • 我完全糊涂了 =) @MarekLipka
【解决方案3】:

我确实遇到了这个问题,它是由三次单击指南的代码块并将代码直接复制/粘贴到我的编辑器(OSX 上的 ST2)中引起的。

您应该检查为链接生成的 HTML 是否如下所示:

<a data-confirm="Are you sure?" data-method="delete" href="/posts/3/comments/3" rel="nofollow">Destroy Comment</a>

如果不是,而是如下所示,则不会应用 Javascript:

<a href="/posts/3/comments/3"                data="{:confirm=&gt;&quot;Are you sure?&quot;}"                method="delete">Destroy Comment</a>

href 和未解析的 Ruby 之间的巨大差距是由将指南中使用的不间断空格(unicode 字符 \u00a0)复制到您的脚本中造成的。

我不确定为什么这不会导致脚本解析错误。

【讨论】:

  • 当您使用它时,您也可以提到查找
  • 抱歉,我不太确定我是否理解您的评论指的是@DouglasG.Allen?
  • 我认为这只是在浏览器中查看页面源,但现在我忘记了。对不起!
【解决方案4】:

确保 gem 'jquery-rails' 在 gemfile 中并且 jquery_ujs 包含在 app/assets/javascripts/application.js 文件中

//= require jquery
//= require jquery_ujs

来源:https://github.com/rails/jquery-ujs

【讨论】:

  • 默认情况下在核心 Rails 应用程序中,但不是在创建引擎时
  • +1 在我的情况下,application.js 缺少 jquery_ujs。我想我在遵循 twitter bootstrap gem 的安装过程时删除了它
  • 仅供参考,纯 jquery 行也是必需的(所以你需要的不仅仅是 jquery_ujs 一个)
【解决方案5】:

我和巴里有同样的问题。确保在 /app/views/index.html.erb 文件中正确复制/粘贴并检查呈现的 html。

【讨论】:

    【解决方案6】:

    我遇到了同样的问题,并意识到我使用-J 创建了我的rails 应用程序,这与--skip-javascript 相同。 您需要启用 JavaScript 才能使其工作;缺少确认删除的弹出窗口是一个死的赠品。

    【讨论】:

      【解决方案7】:

      确保您有一个通过 rake 路由删除 REST 方法。

      DELETE /articles/:id(.:format)                     articles#destroy
      

      我只在这个博客版本上遇到了同样的问题,因为我正在做这两个。 http://blog.8thcolor.com/en/2011/08/nested-resources-with-independent-views-in-ruby-on-rails/

      我也在尝试学习如何使用 Web 控制台并在其中窥探。 我的问题是 binding.pry 不会出现在 destroy 方法中,但会出现。这告诉我它一定是一个坏链接,对吧?它甚至没有使用destroy方法。谢谢大家的答案。我们必须尝试一些事情不是吗? 尝试

      <td><%= link_to 'Destroy', { action: :destroy, id: post.id }, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
      

      不会为那个工作。

      这就是他所拥有的

      <td><%= link_to 'Destroy', [comment.post, comment], :confirm => 'Are you sure?', :method => :delete %></td>
      

      因为你只想删除这里的评论。

      但到目前为止,像下面这样组合并没有错误,但我仍然没有从控制器中的 destroy 方法中获取 binding.pry。

      <td><%= link_to 'Destroy', [comment.post, comment], method: :delete, data: { confirm: 'Are you sure?' } %></td>
      

      而且我从来没有像你期望的那样得到确认。

      因此,请尝试找出可疑的 jquery 发生了什么。 我可以确认这是我的情况,但其余的我会留给 nubes,因为这会出现在谷歌搜索中。

      【讨论】:

        【解决方案8】:

        对于 rails 4.2.X,我遇到了同样的问题。检查了我所有的 javascript 文件,但无法正常工作。如果您仔细查看服务器请求,您将在参数中缺少“authenticity_token”,因此用户将被注销。 在 Rails 4.1 及更高版本中,您必须使用 button_to 而不是 link_to

        【讨论】:

        • 非常感谢。我正在使用 4.2.4 和 link_to 根本没有工作。你是怎么想出来的?
        • 我正在从 Rails 3.2 升级到 4.2。这是我在升级过程中遇到的问题之一
        • O_O 这是一个很棒的临时技巧。有没有人想出如何重新启用令牌? I started my search here
        • 我仔细查看了问题中 OP 发布的服务器日志,但看不到该错误。 link_to 在 Rails 4.2 中运行良好
        • 此方法删除帖子但不会确认
        【解决方案9】:

        我有同样的问题。就我而言,我从

        更改了 \app\views\layouts\application.html.erb 文件
        <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
        <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
        

        <%= stylesheet_link_tag    'default', media: 'all', 'data-turbolinks-track' => true %>
        <%= javascript_include_tag 'default', 'data-turbolinks-track' => true %>
        

        为了避免我的第一个 Rails 问题。但它显然破坏了 JavaScript 的执行并导致了 Destroy 问题。 因此,将您的 \app\views\layouts\application.html.erb 文件回滚到其原始状态,并将此问题视为此处

        Rails ExecJS::ProgramError in Pages#home?

        在 evedovelli 中回答(关于 windows 中的 coffeescript gem)。

        【讨论】:

          【解决方案10】:

          在js中包含以下行

          //= require jquery_ujs
          

          包括宝石:

          gem 'jquery-rails'
          

          销毁链接:

          <%= link_to "Logout", destroy_user_session_path %>
          

          【讨论】:

            【解决方案11】:

            我遇到了同样的问题。我是这样锻炼的:

            我的环境。是: A. ruby​​ 2.2.4p230(2015-12-16 修订版 53155)[x64-mingw32] B. 导轨 4.2.5 C. 浏览器:Firfox 44.02

            1. 在html页面中添加include js,因为delete函数会使用js来处理。 &lt;%= javascript_include_tag "application" %&gt;

            2. skip_before_action :verify_authenticity_token 添加到控制器以防止在 AdsController#destroy 中出现 InvalidAuthenticityToken

            3. 将 link_to 添加到您的网页中 &lt;%= link_to 'Delete', post, method: :delete, data: {confirm: "Are you sure?"}%&gt;

              现在,我可以使用 link_to 从我的页面中删除一条记录。

            【讨论】:

              【解决方案12】:

              我解决了这个问题,只需添加 assets/javascripts/application.js

              //= require jquery_ujs
              

              【讨论】:

                【解决方案13】:

                使用button_to 方法而不是link_to 似乎可行,减去它没有确认的事实(我觉得这很重要)。

                在我的例子中,我使用 react-on-rails 并且有多个布局。

                在我的 hello-world 布局中添加 &lt;%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %&gt; 解决了这个问题。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-11-15
                  • 1970-01-01
                  • 2016-10-23
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-09-10
                  相关资源
                  最近更新 更多