Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 一个控制器,两个编辑操作_Ruby On Rails_Ruby_Nested Forms - Fatal编程技术网

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) %>