Rails ActiveAdmin - изменить после обновления redirect_to

У меня есть страница Feature, которая принадлежит странице Car. Это работает именно так, как я хочу, за исключением одного.

После создания, обновления или уничтожения я хочу, чтобы страница была перенаправлена ​​на admin_car_path(car) вместо значений по умолчанию admin_car_feature_path(car,feature) для создания и обновления и admin_car_features_path(car).

Я безуспешно искал это.

ActiveAdmin.register Car do
end

ActiveAdmin.register Feature do
  belongs_to :car
end

ТИА


person Marcelo    schedule 28.01.2012    source источник


Ответы (6)


Вот код действия обновления для вашего случая. Этот код идет в файл functions.rb — admin:

controller do
  def update
    update! do |format|
      format.html { redirect_to admin_cars_path }
    end
  end
end

Это перенаправляет на страницу индекса автомобилей. Итак, у вас есть идея. То же самое для действий создания и уничтожения.

person kravc    schedule 22.07.2012
comment
Еще одна хорошая вещь в этом подходе: он не переопределяет ошибки проверки, отображаемые на странице редактирования, когда объект недействителен (как я и опасался, поскольку блок не различает, действителен он или нет). - person Luke W; 01.02.2013
comment
Вместо format.html { redirect_to admin_cars_path } вы можете использовать общий подход format.html { redirect_to collection_path } - person Alter Lagos; 23.05.2013
comment
Спасибо вам, ребята. Извините за позднее подтверждение. - person Marcelo; 26.06.2013
comment
этот метод фактически игнорирует ошибки проверки (возможно, в последних версиях active_admin), я разместил код, который работает для меня - person nazar kuliyev; 18.03.2014
comment
Я получаю эту ошибку: development/myproject/app/admin/features.rb:1:in <top (required)>': undefined method controller' for main:Object (NoMethodError), что я делаю неправильно? - person G.B; 28.10.2016

правильный код для обновления без пропуска проверки

controller do
  def update
    super do |success,failure|
      success.html { redirect_to collection_path }
    end
  end
end
person nazar kuliyev    schedule 18.03.2014
comment
Я получаю эту ошибку: development/myproject/app/admin/features.rb:1:in <top (required)>': undefined method controller' for main:Object (NoMethodError), что я делаю неправильно? - person G.B; 28.10.2016
comment
он должен быть помещен внутри ActiveAdmin.register ModelName do end block - person nazar kuliyev; 04.12.2016
comment
Не рекомендуется использовать ключевые слова super в AA (я знаю, это глупо. DSL перебор IMO). по сути, для этого и предназначен метод update!. Вы также можете сделать update! do |success, failure| - person Nick Res; 02.08.2018

В настоящий момент принятый ответ приводит к игнорированию ошибок проверки.

Это работает для меня с последними версиями ActiveAdmin и Rails:

controller do

  def update
    update! do |format|
      format.html { redirect_to collection_path } if resource.valid?
    end
  end

  def create
    create! do |format|
      format.html { redirect_to collection_path } if resource.valid?
    end
  end

end  
person Anri    schedule 26.02.2014
comment
Я получаю эту ошибку: development/myproject/app/admin/features.rb:1:in <top (required)>': undefined method controller' for main:Object (NoMethodError), что я делаю неправильно? - person G.B; 28.10.2016
comment
Прошу прощения, пост 2014 года, руби не использую уже 2 года. - person Anri; 31.10.2016

Марсело, я не уверен, что понимаю ваш вопрос, но не поможет ли добавление этого в действия update, create и destroy в вашем контроллере?

 format.html { redirect_to redirect_address }

И сделайте redirect_address все, что вам нужно.

person kakubei    schedule 23.04.2012

Текущий ответ пропускает проверки. Некоторые другие ответы работают, но частично верны (неправильное использование super или ручная проверка ресурса).

Самый обновленный «правильный» способ перенаправления с помощью AA после создания и обновления:

controller do
  def create
    create! do |success,failure|
      success.html { redirect_to collection_path, notice: "#{resource.model_name.human} was successfully created." }
    end
  end
  def update
    update! do |success,failure|
      success.html { redirect_to collection_path, notice: "#{resource.model_name.human} was successfully updated." }
    end
  end
end
person rorofromfrance    schedule 25.10.2019

Вот решение, которое также работает с create_another, используя parent и child для имен моделей.

Это решение предполагает, что вы показываете дочерние элементы как часть родителя (например, через table_for), поэтому вам не нужен дочерний метод index.

В методах smart_resource_url и index контроллера переопределения ресурсов:

  controller do
    def smart_resource_url
      if create_another?
        new_resource_url(create_another: params[:create_another])
      else
        parent_path(params[:parent_id])
      end
    end

    def index
      redirect_to parent_path(params[:parent_id])
    end
  end
person Jasper    schedule 17.02.2020