【问题标题】:Destroy redirect in Controller Rails Shallow Routing在 Controller Rails 浅层路由中销毁重定向
【发布时间】:2021-07-18 02:19:56
【问题描述】:

我有一个简单的 Rails 模型项目,其中包含许多任务。我正在尝试学习正确的浅层路线,但在大多数教程中,关于控制器任务的解释很少。我的问题是,除了 Destroy 部分,我什么都可以工作。

路线

resources :projects, shallow: true do
   resources :tasks do
end

型号

class Project < ApplicationRecord
  has_many :tasks, dependent: :destroy
end

class Project < ApplicationRecord
  belongs_to :projects
end

然后我有通过脚手架生成的简单控制器。我在任务表中添加了对项目的引用。

我已按照 Digital Oceans 指南了解如何嵌套资源,但我无法找到涵盖控制器和视图的全面浅层教程。

所以我拥有所有其他功能,如显示、编辑、更新等。不知道我是如何让它们工作的,但通过更改词序并添加片段它可以工作......我好。但是现在我无法将其路由回 Tasks 索引(具有项目 ID)URL,在我点击销毁后,该 URL 将是 projects/id/tasks/。我在 TasksController#edit 中不断收到错误 ActiveRecord::RecordNotFound 并且 rails 将这部分突出显示为我的错误问题:

def set_task
   @task = Task.find(params[:id])
end

我知道这是由脚手架默认生成的,我之前添加的唯一部分是之前的操作 get_project 和这个:

def get_project
  @project = Project.find(params[:project_id])
end

任何想法都会很有帮助。

【问题讨论】:

    标签: ruby-on-rails model-view-controller


    【解决方案1】:

    好的,所以我发现我的解决方案更多地考虑它,这实际上是一个重定向问题,并且控制器没有在销毁路​​由中从子控制器获取父 ID。因此,在越来越多地摆弄这个之后,我找到了改变我的销毁重定向的答案:

    redirect_to project_scene_headings_path(@project)
    

    到

    redirect_to project_scene_headings_path(@scene_heading.project_id)
    

    【讨论】:

      【解决方案2】:

      检查您在访问edit 路由时是否传递了project_id 参数。如果与编辑路由无关,可以添加条件跳过编辑路由的before_action:

      before_action :get_project, except: [:edit]
      

      【讨论】:

      • 我已经通过使用 before_action :get_project 得到了类似的东西,只有:[:index, :new, :create]。不幸的是,这没有奏效。这个问题似乎没有重新路由到 projects/id/scene_heading url。该 URL 仍保留 localhost/scene_heading/id 的缩短版本,同时仍尝试调用已删除条目的特定 id。 rails 控制台显示它已被删除并显示此错误: ActionController::UrlGenerationError (No route matches {:action=>"index", :controller=>"scene_headings", :project_id=>nil}, missing required keys: [:project_id ]):
      猜你喜欢
      • 2011-11-19
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      相关资源
      最近更新 更多