【问题标题】:Rails 6: link_to method: :delete not workingRails 6:link_to 方法::删除不起作用
【发布时间】:2021-12-26 08:58:07
【问题描述】:

我有一个使用 Rails 6 和 Bootstrap gem 4.4.1 的应用程序 在我使用设计 gem 的路线中:

devise_for :users, controllers: {
    sessions: 'users/sessions',
    confirmations: 'users/confirmations',
    registrations: 'users/registrations'
  }

views/layout/application.html.slim

doctype html
html
  head
    title
      = full_title(yield(:title))
    meta[name='viewport' content='width=device-width,initial-scale=1' charset='utf-8']
    = csrf_meta_tags
    = csp_meta_tag
    = stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_pack_tag 'application', 'data-turbolinks-track': 'reload'
    = render 'layouts/shim'
    = yield(:head) 
  body
    = render 'layouts/header'
    - flash.each do |message_type, message|
      div class=("text-center alert alert-#{message_type}") = message
    = yield
    = render 'layouts/footer'

我使用 link_to 显示带有method: :delete 的用户注销路径:

= link_to "Log out", destroy_user_session_path, method: :delete

但在app/javascript/application.js 中添加了错误No route matches [GET] "/users/sign_out"

//= require jquery
//= require jquery_ujs 

除了使用button_to之外还有什么办法吗?

【问题讨论】:

  • 这对您有帮助吗? stackoverflow.com/questions/44466430/…
  • 我用gem 'jquery-rails'
  • 既然你用的是jquery-ujs,你应该改用data: {method: 'delete'}
  • @RubyRacer method: :deletedata: {method: 'delete'} 的快捷方式,因此完全没有区别。

标签: jquery ruby-on-rails


【解决方案1】:

也许你的 JavaScript 有错误,检查你的控制台,它不应该是一个 GET 而是一个 DELETE(在网络选项卡中它会显示一个带有删除方法的 POST)

【讨论】:

    【解决方案2】:

    您正在遵循过时的说明。

    • Rails 6 defaults to Webpacker 而不是 Sprockets。您使用的是javascript_pack_tag,而不是旧的javascript_include_tag
    • Rails 5.1 将 jquery_ujs 替换为 rails_ujs,从而消除了 jQuery 依赖项。

    “神奇的”//= cmets 被称为 Sprockets 指令,在 Webpacker 中完全没有任何作用——它只是一个注释。 Webpacker 改为使用 import directive from ES6

    当您生成 Rails 6 应用程序时,它实际上会创建一个 app/javascripts/packs/application.js 文件,该文件可以正确设置 Rails UJS、Turbolinks、ActiveStorage 和 ActionCable。

    您还可以通过运行 bin/rails webpacker:install 将其添加到现有应用中。

    // This file is automatically compiled by Webpack, along with any other files
    // present in this directory. You're encouraged to place your actual application logic in
    // a relevant structure within app/javascript and only use these pack files to reference
    // that code so it'll be compiled.
    
    import Rails from "@rails/ujs"
    import Turbolinks from "turbolinks"
    import * as ActiveStorage from "@rails/activestorage"
    import "channels"
    
    Rails.start()
    Turbolinks.start()
    ActiveStorage.start()
    

    然后您需要使用 ./bin/webpack-dev-server 启动 webpacker 开发服务器,该服务器将为资产提供服务。与 Sprocket 不同,它没有“捆绑”到 rails server 命令中。

    除了使用 button_to 之外,还有什么方法可以解决这个问题吗?

    是的。修复您的 javascript 设置(推荐)或在 config/intializers/devise.rb 中使用 config.sign_out_via = [:delete, :get] 来掩埋错误。

    但是在这种情况下,我真的建议您使用button_to,因为即使发生脚本错误,它也会让您的用户注销。如果那是你的挂断,你可以使用 CSS 来设置你想要的按钮样式。

    【讨论】:

    • 感谢您的回答。我有 1 个关于 button_to 的问题,在以前的版本中,我制作了一个使用 link_to 和 json 格式的最喜欢的函数来不重新加载页面。但是当使用 button_to 时,它会重定向到 json 页面
    • @HàMai 这不是一个使用 button_to 的用例。
    猜你喜欢
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2012-09-18
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多