一个控制器,两个编辑操作

One controller, two edit actions

我想尝试两种不同的编辑操作:

如何使用不同的方法呈现编辑操作?

我的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

几个选项:

  1. 为新端点提供不同的方法名称(即 edit2)和新路由。
  2. 在辅助方法(即模型或应用程序控制器)中编写新代码,如果满足某些条件,则将原始 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) %>

这就是添加新操作的全部内容。