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

时间:2016-05-08 20:03:33

标签: ruby-on-rails ruby nested-forms

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

  • 一个嵌套表单(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

2 个答案:

答案 0 :(得分:1)

几个选项:

  1. 为新端点指定不同的方法名称(即edit2)和新路由。
  2. 在辅助方法(即模型或应用程序控制器)中编写新代码,如果满足某些条件,则更改原始edit操作的代码以运行新代码。
    例如,我可以检查是否params[:edit_type].eql?("edit2")并从原始def edit2操作中调用新的编辑逻辑(即application_controller中定义的edit)。

答案 1 :(得分:1)

您可以进行一些简单的更改。首先,在routes.rb文件中,您需要添加新路由。最简单的方法是:

resources :courses do
  member do
    get "editclean"
  end
end

这将添加&#34; editclean&#34;在您的控制器中路由和自动editclean操作。

在控制器中,您可以向before_action处理程序添加editclean操作:

before_action :set_course, only: [:show, :edit, :editclean, :update, :destroy]

您还必须创建视图文件editclean.html.erb。您的edit操作可能与_form.html.erb操作共享new部分操作。您可以向此部分添加条件,也可以将相关位复制到新视图文件。这是您的新视图的样子:

<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_to "Edit (clean)", editclean_course_path(@course) %>

关于添加新动作的所有内容。