【问题标题】:rails 3 - link_to to destroy not workingrails 3 - link_to 销毁不工作
【发布时间】:2011-01-05 17:01:34
【问题描述】:

我正在尝试创建一个到我的用户控制器的销毁链接,我也在使用设计。

这是我的代码 -

查看

<%= link_to 'Delete User?', child, :confirm => "Are you sure you want to delete #{child.full_name}?", :method => :delete, :class => "user-additional", :style => "font-size:12px;font-weight:normal;" %>

控制器

def destroy
 if @user = User.find(params[:id])
  @user.destroy
  respond_to do |format| 
    format.html { redirect_to account_index_path } 
    format.xml { head :ok } 
  end
 end
end

路线

devise_for :users 
resources :users, :except => [:new]

链接转换为 localhost:3000/users/10

点击后会打开用户显示而不是删除他们

有什么想法吗?

【问题讨论】:

  • 你知道链接是使用GET还是DELETE请求吗?我知道您在那里指定了方法,但是当您说链接解析为 localhost:3000/users/10 时,这可能意味着几件事。您可以使用 Firebug 或 Chrome Inspector 等检查工具进行检查。
  • 是否启用了 JavaScript? rails.js 文件是否包含在应用程序布局文件中?原型 JS 库怎么样?如果正在使用 jQuery 和原型 JS 库,请尝试仅使用原型?
  • 可能你的布局头部的脚本文件链接错误。
  • link_to 如果它不是一个获取请求,那么它是一个不好的做法,因为它可以在一个新的点击中打开......被网络爬虫点击......等等用户 button_to 代替它创建一个表单

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

破坏性操作应作为表单提交执行 - http://www.w3.org/2001/tag/doc/whenToUseGet.html#checklist

改用button_to(传递:method =&gt; :delete)并适当地设置按钮样式。

【讨论】:

  • 非常感谢!我已经解决了这个问题 2 小时,您的回答可以节省我的工作时间。
【解决方案2】:

其实我昨天也遇到了同样的问题

试试这个:

<%= button_to "delete", your_object, :method=>:delete, :class=>:destroy %>

它有效(至少对我来说)

【讨论】:

  • 也为我工作,但不知道为什么它不能与 link_to 一起工作。 jQuery 自动包含在 rails 4.2 中。我正在使用红宝石 2.0.0。在 Google chrome 内容设置中启用了 Javascript。
  • 使用嵌套对象(传递了 child_object)并删除了父对象。
【解决方案3】:

如果您使用的是 jQuery 而不是 Prototype,您可能会丢失一个 javascript 文件。

您可以从 jquery-ujs GitHub 页面或 Railscasts 的 episode 205 找到有关如何将其添加到项目的详细信息。

【讨论】:

  • +1 尽管这没有被标记为“正确”,但它把我指向了 ujs,这是我需要放弃 jQuery 原型的最后一件事。谢谢!
【解决方案4】:

我猜我认为这是因为在 Rails 3 中,不显眼的 javascript 现在用于诸如此类的功能(Rails 2 会为您的代码输出一堆讨厌的内联 javascript,Rails 3 将 javascript 放在外部文件中,并使用 HTML5 data- 属性与之交互。)

要解决此问题,您需要在页面标题中包含 &lt;%= csrf_meta_tags %&gt; 以引用外部 javascript。它还处理 XSS 问题。

这里有一些细节:Delete link sends "Get" instead of "Delete" in Rails 3 view

【讨论】:

  • 我不认为它是我刚刚尝试过的 js - :delete %> 没有运气
  • @Maruccio,现在是,但那是正确的。无论如何,我会编辑以保持这个答案是最新的。
【解决方案5】:

如果你使用的是 jQuery,请确保你有这样的东西:

<script type="text/javascript">
  // this allows jquery to be called along with scriptaculous and YUI without any conflicts
  // the only difference is all jquery functions should be called with $j instead of $
  // e.g. $jQ('#div_id').stuff instead of $('#div_id').stuff
  var $jQ = jQuery.noConflict();
</script>

【讨论】:

  • 将它分配给 jQ 对我不起作用,我只是调用了 jQuery.noConflict();然后我会像 jQuery(document) 一样使用它而不是 $(document) 更多信息在这里:yehudakatz.com/2007/01/31/using-jquery-in-rails-part-i
  • 使用 jQ=JQuery.noConflict();使 jQuery 从 $jQ 中可用,而不是使用 $,这有助于使对 jQuery 和 javascript/ajax 的调用不会相互冲突。我遇到了同样的问题,这行代码使我的删除链接再次起作用。也许您的问题出在其他地方。
  • 它确实解决了我的问题。我唯一要指出的是,使用 $jQ 对我不起作用。
  • 看来是我的错,我打错了变量名,应该是:var $jQ = jQuery.noConflict();我会编辑帖子并更正它,感谢您指出。
【解决方案6】:
  1. 按照安装部分的步骤rails/jquery-ujs
  2. 在您的布局文件中添加

【讨论】:

  • 这似乎是在回答一个不同的问题
【解决方案7】:

如果您的应用程序中没有包含 jquery 和 jquery-ujs,那么脚手架自带的默认 link_to 将不起作用!

我遇到了同样的问题。包含这两个js后解决了!

【讨论】:

    【解决方案8】:

    此外,如果您在生产模式下遇到此问题,可能是因为您尚未编译资产。见http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

    【讨论】:

    • 这才是真正的原因,是命令:RAILS_ENV=production bin/rake assets:precompile
    【解决方案9】:

    通过确认消息为我工作。

    <%= button_to 'Destroy', {action: :destroy, id: version.id},  onclick: 'return confirm("Are you sure?")', method: :delete %>
    

    【讨论】:

      猜你喜欢
      • 2011-05-19
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      相关资源
      最近更新 更多