При редактировании формы в ActiveAdmin, вы можете переопределить действие Обновить, чтобы создать вместо обновления? - PullRequest
0 голосов
/ 10 мая 2018

Я бы хотел, чтобы AdminUser мог редактировать опрос, а затем после сохранения изменений создать новый объект съемки вместо текущей редактируемой съемки.

Попытка переопределить действие обновления в контроллере для вызова действия создания вместо обновления, но безуспешно.Вот одна из попыток (я знаю, что вы не можете просто вызвать 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 голосов
/ 11 мая 2018

Если ваша цель - клонировать опрос, используйте настраиваемое действие, например:

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

Если вы хотите сохранить историю, рассмотрите плагин для аудита

0 голосов
/ 30 мая 2018

Другое решение

  1. Переопределить метод контроллера new:

    def new
      @survey = Survery.find(params[:clone_id]) if params[:clone_id]
      super
    end
    
  2. Поместите ссылку, где вы хотите запустить действие "Клон", из:

Ресурс покажет страницу:

    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
0 голосов
/ 10 мая 2018

Я думаю, вы можете пойти с чем-то вроде этого:

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 (он попытается обновить вместо сохранения).

Ps. Неправильно создавать новый опрос для каждого обновления.Я думаю, что вы должны иметь отношение has_many между опросом и его обновлениями.

...