Ruby on rails 一个控制器,两个编辑操作
我想尝试两种不同的编辑操作:Ruby on rails 一个控制器,两个编辑操作,ruby-on-rails,ruby,nested-forms,Ruby On Rails,Ruby,Nested Forms,我想尝试两种不同的编辑操作: 一个具有嵌套形式(edit) 一个没有(editclean) 如何使用其他方法渲染编辑操作 我的课程\u controller.rb: class CoursesController < ApplicationController before_action :set_course, only: [:show, :edit, :update, :destroy] def new @course = Course.new end
- 一个具有嵌套形式(
)edit
- 一个没有(
)editclean
课程\u controller.rb
:
class CoursesController < ApplicationController
before_action :set_course, only: [:show, :edit, :update, :destroy]
def new
@course = Course.new
end
def edit # <<<< edit nested
@course.events.build
end
def editclean # <<<< edit only course
end
def create
@course = Course.new(course_params)
respond_to do |format|
if @course.save
format.html { redirect_to @course }
else
format.html { render :new }
end
end
end
def update
respond_to do |format|
if @course.update(course_params)
format.html { redirect_to @course }
else
format.html { render :edit }
end
end
end
private
def set_course
@course = Course.find(params[:id])
end
def course_params
params.require(:course).permit(:name, events_attributes: [:id, :starts_at])
end
end
class CoursesController
为新端点指定不同的方法名称(即edit2
)和新路由
在助手方法(即模型或应用程序控制器)中编写新代码,并在满足某些条件时更改原始edit
操作的代码以运行新代码。
例如,我可能会检查params[:edit_type].eql?(“edit2”)
,并从原始edit
操作调用新的编辑逻辑(即def edit2
,在application_controller
中定义)李>
您需要做一些简单的更改。首先,在routes.rb
文件中,您需要添加新路由。最简单的方法是:
resources :courses do
member do
get "editclean"
end
end
这将在控制器中添加“editclean”路由并自动执行editclean
操作
在控制器中,您可以将editclean
操作添加到您的before\u操作处理程序:
before_action :set_course, only: [:show, :edit, :editclean, :update, :destroy]
您还必须创建视图文件editclean.html.erb
。您的编辑
操作可能与新建
操作共享\u form.html.erb
部分。您可以向该部分添加条件,也可以将相关位复制到新的视图文件中。以下是您的新视图的外观:
<h2>Edit (clean) Course</h2>
<%= form_for @course do |f| %>
<%= f.label :title, "Title" %>
<%= f.text_field :title %>
<%= f.label :start_date, "Start Date" %>
<%= f.text_field :start_date %>
<%= f.label :end_date, "End Date" %>
<%= f.text_field :end_date %>
<%= f.submit "Save" %>
<% end %>
这就是添加新操作的全部内容。我编辑了您的问题,因为您的术语有点混乱。在上面的代码中,您有一个控制器,名为CoursesController的类。在该控制器中,您有几种不同的方法:new
、edit
、editclean
,等等。在Rails中,我们调用处理请求操作的方法(方法set\u course
和course\u params
不是操作)。考虑到这一点,我在你的问题中将“controller”替换为“action”。我更新了路由,添加了before\u操作,创建了视图和指向它的链接(实际上是课程编辑清理路径(@course
),但当我转到localhost:3000/courses/1/editclean时,它会给出错误ActiveRecord::RecordNotFound in CoursesController#editclean找不到没有ID的课程@Course=Course.find(params[:ID])
您的数据库是否有id为1的记录?是否可以使用该id转到“编辑”
操作?请注意,所有操作共享的“设置课程”私有方法是从数据库检索课程的方法。如果editclean
的记录被中断,则所有操作的记录都被中断。如果尝试路由f或者数据库中的id
,您应该可以看到它是有效的。它看起来像是我的路线中的/courses/:courses\u id/editclean(:format)
,而在正常编辑中它是/courses/:id/edit(:format)
-它找不到列course\u id。你知道如何传递id
而不是course\u id
?我刚刚更新了路线的定义。我添加了一个成员do
块,它应该解决命名问题。试试看它是否适合你。
<%= link_to "Edit (clean)", editclean_course_path(@course) %>