在ActiveAdmin中编辑表单时,是否可以将“更新”操作覆盖为“创建”而不是“更新”?

时间:2018-05-10 18:14:58

标签: ruby activeadmin

我希望AdminUser能够编辑调查,然后在保存编辑后,创建一个新的Survey对象而不是正在编辑的当前调查。

尝试覆盖控制器中的更新操作以调用create操作而不是更新,但没有运气。这是尝试中的一个(我知道你不能只是像这样调用create,但它显示了意图!):

ActiveAdmin.register Survey do
  ...

  controller do
    def update
      survey_hash = (params[:survey].to_h) 
      create(options = survey_hash)
    end
  end
end

我怎样才能做到这一点?谢谢!

更新:请求的调查模型:

class Survey < ApplicationRecord
  belongs_to :admin_user
  has_many :sections
  has_many :submissions
  has_many :question_sets, through: :sections
  has_many :questions, through: :question_sets
  accepts_nested_attributes_for :sections, allow_destroy: true
  ...
end

3 个答案:

答案 0 :(得分:0)

我认为你可以选择这样的东西:

ActiveAdmin.register Survey do
  controller do
    def your_method_name
      @survey = Survey.new(survey_params) 
      if @survey.save
        # ...
      else
        # ...
      end
    end

    def survey_params
      params.permit(:survey => [:param1, :param2]) # remove id parameter to make it work
    end
  end
end

我在此链接中找到了有关更新控制器的Active Admin信息。

  • 您必须删除id参数,否则Survey.new如果找到id参数将无效(它将尝试更新而不是保存)。

P.s:为每次更新创建新的调查似乎不正确。我认为你应该在调查及其更新之间建立一个has_many关系。

答案 1 :(得分:0)

如果您的目的是克隆调查,请使用如下自定义操作:

action_item(:copy_and_edit, only: :show) do
  link_to "Clone and edit", duplicate_survey_path(resource), :method => :get
end

member_action :duplicate, method: :get do
  @survey = resource.dup
  render :new, layout: false
end

如果您打算保留历史记录,请考虑auditing plugin

答案 2 :(得分:0)

另一种解决方案

  1. 覆盖new控制器方法:

    def new
      @survey = Survery.find(params[:clone_id]) if params[:clone_id]
      super
    end
    
  2. 在以下任何位置放置“克隆”操作的链接:

  3. 资源显示页面:

        action_item :duplicate, only: :show do
          link_to 'Clone', new_survey_path(clone_id: resource.id), method: :get
        end
    

    资源编辑表单:

          f.actions do
            f.action :submit
            f.action :cancel, label: 'Clone',
                              url: new_survey_path(clone_id: resource.id)
          end