【发布时间】:2021-09-09 03:18:13
【问题描述】:
我花了一段时间尝试调试此行为,但未成功,因此我希望帮助找出为什么我的嵌套资源参数似乎以错误的顺序包含在 URL 中。出于某种原因,可以为课程添加和删除课程,但编辑课程会崩溃,因为 ActiveRecord 尝试使用课程 ID 查找课程,反之亦然。
课程和课程模型
class Course < ApplicationRecord
has_many :lessons, dependent: :destroy
extend FriendlyId
friendly_id :title, use: :slugged
class Lesson < ApplicationRecord
belongs_to :course
extend FriendlyId
friendly_id :title, use: :slugged
课程控制器
class LessonsController < ApplicationController
before_action :set_lesson, only: [:show, :edit, :update, :destroy ]
def index
@lessons = Lesson.all
end
def show
end
def new
@lesson = Lesson.new
@course = Course.friendly.find(params[:course_id])
authorize @lesson
end
def edit
authorize @lesson
end
def create
@lesson = Lesson.new(lesson_params)
@course = Course.friendly.find(params[:course_id])
@lesson.course_id = @course.id
if @lesson.save
redirect_to course_lesson_path(@course, @lesson), notice: "Lesson was successfully created."
else
render :new, status: :unprocessable_entity
end
end
def update
authorize @lesson
if @lesson.update(lesson_params)
redirect_to course_lesson_path(@course, @lesson), notice: "Lesson was successfully updated."
else
render :edit
end
end
def destroy
authorize @lesson
@lesson.destroy
redirect_to course_path(@course), notice: "Lesson was successfully destroyed."
end
private
def set_lesson
@course = Course.friendly.find(params[:course_id])
@lesson = Lesson.friendly.find(params[:id])
end
def lesson_params
params.require(:lesson).permit(:title, :content, :course_id)
end
end
路线
resources :courses do
resources :lessons
end
当我做 Rails 路线时会出现什么:
edit_course_lesson GET /courses/:course_id/lessons/:id/edit(.:format)
但是,当我实际编辑课程时,参数似乎会切换,从而导致崩溃。请参阅下面的示例,它认为第四课是课程。
网址:/courses/fourth-lesson/lessons/forensic-science-344/edit
ActiveRecord::RecordNotFound in LessonsController#edit
can't find record with friendly id: "fourth-lesson"
private
def set_lesson
@course = Course.friendly.find(params[:course_id]) <- Crashes on this line
@lesson = Lesson.friendly.find(params[:id])
end
更新:这是编辑课程的表格。
.container
= simple_form_for([@course, @lesson]) do |f|
= f.error_notification
= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present?
.form-inputs
= f.input :title
= f.input :content
%small
= f.error :content, class: 'text-danger'
.form-actions
= f.button :submit, class: 'btn btn-primary my-4'
【问题讨论】:
-
创建 URL 的代码在哪里? (可能是一种形式?)我错过了吗?抱歉,如果我忽略了...
-
路径切换是在哪里发生的?是编辑表单的链接,表单进行的更新调用,还是保存成功并重定向到显示路径?
-
我添加了表单的代码。至于路径切换的位置,崩溃发生在编辑保存之前。除此之外,不确定如何判断它何时发生 - 关于进一步确定它的任何建议?
-
@Greg 我们需要创建编辑链接的代码。这可能通过传递对象的顺序发生:例如
edit_course_lesson_path(lesson, course)会给出与您得到的类似的错误。正确的方法是:edit_course_lesson_path(course, lesson)
标签: ruby-on-rails nested-routes