Rails 入门 blog 项目点击 destroy 没有反应没有窗口怎么解决?

chengfeng · 2025年01月08日 · 最后由 Rei 回复于 2025年01月09日 · 117 次阅读

问题如题,新手一个,跟着 Rails 入门指南学习,但是做到 CRUD 最后的 D 时,发现点击没反应。 (昨天注册的发现没法提问,跟相关贴无人回复,今天发现可以发帖了,惊喜!😋

核对了代码,在论坛也搜索了相关问题,发现实现上似乎是没有问题的? 也咨询了 AI,只给出了一些不甚精确、没啥用的解决方案。

试过的可能办法:

  • html 结构不正确,通过页面源代码查看验证,无问题未解决;
  • turbo 脚本未加载,app/views/layouts/application.html.erb 中缺少 <%= javascript_importmap_tags %>,添加未解决;
  • 浏览器权限、兼容问题,设置确认过,同样未解决;
  • jquery-rails gem 未加载,重新下载亦未解决(另外我的 Gemfile 本来就没这个,私以为官方教程项目按道理不会漏吧?)

所以实在无可奈何,请教下这里的大神们有没有相关的经验解决?

相关代码实现如下:

views/articles/show.html.erb

<li><%= link_to "Destroy", article_path(@article), data: {
                   turbo_method: :delete,
                   turbo_confirm: "Are you sure?"
                 } %></li>

controllers/articles_controller.rb

def destroy
  @article = Article.find(params[:id])
  @article.destroy

  redirect_to root_path, status: :see_other
end

点击 Destroy 时 rails 终端控制台的输出:

Started GET "/articles/2" for 114.242.67.194 at 2025-01-07 17:39:21 +0800
Cannot render console from 114.242.67.194! Allowed networks: 127.0.0.0/127.255.255.255, ::1
Processing by ArticlesController#show as HTML
  Parameters: {"id"=>"2"}
  Article Load (0.1ms)  SELECT "articles".* FROM "articles" WHERE "articles"."id" = ? LIMIT ?  [["id", 2], ["LIMIT", 1]]
  ↳ app/controllers/articles_controller.rb:9:in `show'
  Rendering layout layouts/application.html.erb
  Rendering articles/show.html.erb within layouts/application
  Rendered articles/show.html.erb within layouts/application (Duration: 0.2ms | Allocations: 91)
  Rendered layout layouts/application.html.erb (Duration: 2.0ms | Allocations: 1274)
Completed 200 OK in 4ms (Views: 2.4ms | ActiveRecord: 0.1ms | Allocations: 2058)

个人看起来似乎是 DELETE 方法未生效?有没有大神指点一下

对了 我的 rails 版本是 7.1.5.1

https://discuss.rubyonrails.org/t/guide-v7-0-3-1-link-to-destroy-turbo-method-delete-doesnt-works-ubuntu-22-04/81326/12

搜到类似的情况,如果 turbo 库版本和配置没有问题的话,应该是需要将 link_to 改成 button_to

看起来是 turbo 没加或者没开启,ref: https://github.com/hotwired/turbo-rails

jiting 回复

感谢!换成 button_to 后可以删除了,不过没有弹出确认语句😂

<li><%= button_to "DestroyButton", article_path(@article), method: :delete, data: {
                  confirm: "Are you sure?"
                }, class: :button %></li>
xiaocui 回复

感谢!看了链接里的解决办法,在 views/layouts/application.html.erb 加上这句奏效了

<%= javascript_include_tag "turbo", type: "module" %>

看来我得多在外网搜一搜😂

另外,看到上面的链接里有提到完整的项目似乎应该有很多 js 文件,比如 application.js,但是我的没有

root@hcr:~/newRailsTry/blog# find . -name *.js
./app/assets/config/manifest.js

什么情况😂

我也使用 Rails,但是在使用 turbo 进行 CRUD 时从未遇到过这个问题。您可以尝试再次检查 link_to,看看它是否正确。如果您不想使用 turbo 并直接尝试而不使用 turbo_method,您可以只使用简单的 link_to 而不添加那些数据属性来查看它是否有效。That's Not My Neighbor

巧了不是 gorails 最近的视频 就是讲如何不用 js 在 form 里面 实现一次 delete 的 another form 的操作

<%= form_with model: product do |form| %>
  <%# rest of the form ... %>

  <div>
    <%= form.submit %>
    <%= button_tag "Delete", form: :delete_product %>
  </div>
<% end %>

<%= form_with model: @product, method: :delete, id: :delete_product, data: { turbo_confirm: "Are you sure?" } do %>
<% end %

这个实际是 使用的 html 的特性

我解释下,form 里面的 ButtonTag 会生成一个 Button 但是 由于有 form attribute 实际上他会触发另外一个 form(对应 id)的提交 (如果没有 form 这个 attribute 的话 点击按钮后,他会提交自身所在的这个 form )

之后这个另外的 form 你爱写哪里写哪里,只要在这个页面里就好

以上知识均为 html 知识,不涉及到 rails 本身

ps: 由于 form 的 method 是不支持 delete,所以实际上 底下那个 form 会生成一个 method 为 post 的 但是会在 form 里生成一个 hidden 的 input name 为 _method 值为 delete 这样当提交这个 form 的时候 rails 就会将这个 post 请求 等效于 delete 请求

rails 6 -> 7 使用的 turbo 有变化,用的包不同,属性从 data-* 换成了 data-turbo-*。搜论坛可能会搜到旧的内容。

不知道你看的是哪个版本教程。现在推荐看英文官方的教程 https://guides.rubyonrails.org/ ,目前版本是 8.0.1。要看中文的可以用翻译软件翻译全页。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号