一个控制器,两个编辑操作
One controller, two edit actions
我想尝试两种不同的编辑操作:
- 嵌套形式 (
edit
)
- 一个没有 (
editclean
)
如何使用不同的方法呈现编辑操作?
我的courses_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
几个选项:
- 为新端点提供不同的方法名称(即
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_action 处理程序:
before_action :set_course, only: [:show, :edit, :editclean, :update, :destroy]
您还必须创建视图文件 editclean.html.erb
。您的 edit
操作可能与 new
操作共享一个 _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 %>
请注意,这将重新使用现有的 update
操作来保存字段。如果您想要特殊行为(避免某些数据检查),您可能想要实施替代操作,但基本 update
操作经常完全按预期工作。
当您 link 这样做时,您可以使用自动为您创建的路由助手,如下所示:
<%= link_to "Edit (clean)", editclean_course_path(@course) %>
这就是添加新操作的全部内容。
我想尝试两种不同的编辑操作:
- 嵌套形式 (
edit
) - 一个没有 (
editclean
)
如何使用不同的方法呈现编辑操作?
我的courses_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
几个选项:
- 为新端点提供不同的方法名称(即
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_action 处理程序:
before_action :set_course, only: [:show, :edit, :editclean, :update, :destroy]
您还必须创建视图文件 editclean.html.erb
。您的 edit
操作可能与 new
操作共享一个 _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 %>
请注意,这将重新使用现有的 update
操作来保存字段。如果您想要特殊行为(避免某些数据检查),您可能想要实施替代操作,但基本 update
操作经常完全按预期工作。
当您 link 这样做时,您可以使用自动为您创建的路由助手,如下所示:
<%= link_to "Edit (clean)", editclean_course_path(@course) %>
这就是添加新操作的全部内容。