【问题标题】:How to fix strange rails route: DELETE activity.id如何修复奇怪的 Rails 路线:DELETE activity.id
【发布时间】:2020-08-20 04:05:36
【问题描述】:

我正在使用 public_activity gem、rails 6.0.3.2 和 ruby​​ v2.71。

在列出跟踪活动的页面上,我想为记录列表中的每条记录放置一个销毁按钮。我已经用下面显示的代码做到了。但是,我收到路由错误。 rails 正在寻找的路线是

activity.id

我想要的路线是

activity/:id

这是 html (HAML) 视图的相关部分:

-@activities.each do |activity|
 ...<other code>...    
 .float-right
      = link_to 'Destroy', activity_path(activity), method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-sm btn-danger'

这是我的 config/routes.rb 文件中的相关路由:

delete 'activity/:id', to: 'home#destroy_activity'

此路由返回一个错误,指出“没有路由匹配 [DELETE]”/activity.239”(显然每个记录 id 都不同)。

如果我将路线更改为:

delete 'activity.:id', to: 'home#destroy_activity'

但这对我来说看起来很奇怪,我宁愿使用“正常”的 rails 路线。

我做错了什么?

【问题讨论】:

  • Rails 的路线存在约定问题。尝试将as: :delete 添加到路由定义的末尾。

标签: ruby-on-rails routes


【解决方案1】:

尝试这样做:

activity_path(activity.id)

代替:

activity_path(activity)

您已经使用delete 'activity/:id', to: 'home#destroy_activity' 定义了一个自定义路由,因此这需要对象的id 而不是对象本身。最好总是在路由定义的末尾添加:as,这样您就可以这样做:

delete 'activity/:id', to: 'home#destroy_activity', as: :activity_destroy

然后你可以像这样引用这条路径:

activity_destroy_path(activity.id)

最好的方法是始终为这些东西设置一个单独的控制器。因此,当您在家庭控制器中创建了一个动作 destroy_activity 时,您可以创建一个单独的 activities_controller 并添加如下Kaom Te 在下面的answer 中提到的这样的路由:

resources activities

默认情况下,这将为活动生成 CRUD 操作,但您可以使用 onlyexcept 对其进行限制。

【讨论】:

  • 我已经尝试过 activity_path(activity.id) 但没有奏效。但是,按照建议更改路线并按照建议使用新路径名称 (activity_destroy_path(activity.id)) 确实有效。非常感谢!
【解决方案2】:

Rails 鼓励使用宁静的资源。通常我会在我的 routes.rb 文件中做这样的事情。

# Add others if appropriate... :create, :show... etc.
resources activities, only: [:destroy]  

这将由您的活动控制器在活动控制器.rb 中处理。

那么你的链接就是

= link_to 'Destroy', activity, method: :delete, data: { confirm: 'Are you sure?' }, class: 'btn btn-sm btn-danger'

您的 ActivitiesController 看起来像这样

class ActivitiesController < ApplicationController
  def destroy
    @activity = PublicActivity::Activity.find(params[:id])
    @activity.destroy

    # Redirect or whatever here....
  end

【讨论】:

  • 好吧,我不太确定该怎么做。我正在使用 public_activity gem,它将其功能“打包”为 PublicActivity::Activity。我不想干扰任何内置功能。
  • 我添加了有关控制器外观的详细信息。我不能说 100%,因为我不使用 PublicActivity,但如果这搞砸了内置的 PublicActivity 功能,我会有点惊讶。
  • 好的,谢谢。我会试一试。那会更像我习惯的那样。
猜你喜欢
  • 2020-02-22
  • 2020-03-22
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 2023-03-09
  • 2020-11-26
相关资源
最近更新 更多