ActiveAdmin - как отобразить шаблон по умолчанию в настроенном действии - PullRequest
6 голосов
/ 11 июля 2011

Мы используем ActiveAdmin в нашем приложении Rails3 для моделей по умолчанию.Теперь нам нужно было перезаписать действие шоу.Модель OrderProcess является временной моделью (без таблиц), что означает, что все поля агрегированы из других данных.Мы используем внутренний модуль, который предоставляет необходимые методы для моделирования методов MetaSearch, от которых зависит ActiveAdmin.Ниже описывается, как мы перезаписываем действие show:

ActiveAdmin.register OrderProcess do  
  member_action :show, :method => :get do
    @order_process = OrderProcess.all_orders_for_deal(params['id'])
  end
end

Это приводит к ошибке с жалобой на отсутствующий шаблон "Отсутствует шаблон admin / order_processes / show with ..."

Мы такжепопытался вызвать

  render renderer_for(:show)

, но возникла ошибка, связанная с отсутствующим методом имя_модели, которое может быть связано с тем, что наша модель не содержит таблиц, и с соответствующим модулем.

Как мы можем использовать встроенные в рендеринг ActiveAdminsспособы отображения нашей модели?Любая помощь приветствуется.

Ответы [ 5 ]

3 голосов
/ 16 апреля 2016

Просто наткнулся на это ... Комментарий Гранта правильный, active_admin_template больше не существует (я нахожусь на 1.0.0-pre2).

Я закончил с:

render :action => :edit, :layout => false

, что, кажется, работает, хотя вам нужно будет указать метку для заголовка, которая будет отображаться как «отсутствует перевод: en.active_admin. [Your_action] _model»

2 голосов
/ 06 апреля 2012

Решение, упомянутое на , это другое сообщение от stackoverflow сработало:

render active_admin_template('edit.html.arb'), :layout => false
2 голосов
/ 16 апреля 2014

У меня была похожая проблема, когда мне нужно было переопределить поведение активного администратора по умолчанию для действия обновления. Я получил его на работу так:

controller do
  def update
    @model = Model.find(params[:id])
    # do stuff
    if @model.save
      redirect_to admin_model_path(@model)
    else
      render :edit
    end
  end
end

Ключ был просто render :edit, который будет отображать страницу редактирования по умолчанию, уже определенную активным администратором.

Другое решение, использующее

render active_admin_template('edit.html.arb'), :layout => false

не сработало для меня или любой другой комбинации render renderer_for(:edit).

1 голос
/ 25 июля 2011

У меня та же проблема: (

Я пытаюсь переопределить действие обновления и пытаюсь отобразить 'действие редактирования'

member_action :update, :method => :post do
  if params[:user][:password].blank?
    [:password, :password_confirmation, :current_password].collect{|p| params[:user].delete(p) }
  end

  @user = User.find(params[:id])
  respond_to do |format|
    if @user.update_attributes(params[:user])
      format.html { redirect_to([:admin, @user]) }
    else
      format.html { render renderer_for(:edit) }
    end
  end
end
0 голосов
/ 22 декабря 2017

Документы activeadmin очень легки в особенностях переопределения стандартного действия контроллера, что разочаровывает, учитывая непрозрачность исходного кода. Похоже, что многие из внутренних элементов гема изменили тонну с версией 1.0, которая делает многие старые ответы на переполнение стека непригодными для использования.

В любом случае, вот как я выше описал переопределение действия #create в моем контроллере activeadmin (в Rails 4.2.x):

  controller do
    def create
      @user = User.create_from_admin(permitted_params[:user])

      if @user.persisted?
        redirect_to resource_path(@user), notice: I18n.t("admin.user.create.notice")
      else
        render :action => :new
      end
    end
  end

Стоит отметить, что activeadmin ожидает, если ваша модель - Пользователь, чтобы действие создания имело заполненный экземпляр модели как @user, прежде чем он сможет отрендерить action => :new.

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

Для контекста мне нужно было переопределить это действие, потому что я использую Devise, и я хотел, чтобы мои администраторы создавали учетные записи пользователей с временным паролем и настраиваемым приветственным письмом, а не встроенным: подтверждающее письмо для самостоятельного создания. счета.

Вот метод класса User:

  def self.create_from_admin(params)
    generated_password = Devise.friendly_token.first(8)

    @user                    = User.new(params)
    @user.password           = generated_password
    @user.skip_confirmation!

    if @user.save
      # Code to send custom email with temp password
    end

    @user
  end
...