我希望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
答案 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)
覆盖new
控制器方法:
def new
@survey = Survery.find(params[:clone_id]) if params[:clone_id]
super
end
在以下任何位置放置“克隆”操作的链接:
资源显示页面:
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