ActiveAdmin - как отображать шаблон по умолчанию в настроенном действии

Мы используем ActiveAdmin в нашем приложении Rails3 для моделей по умолчанию. Теперь нам нужно перезаписать действие show. Модель OrderProcess является переходной (безтабличной) моделью, что означает, что все поля агрегируются из других данных. Мы используем внутренний модуль, который предоставляет необходимые методы для имитации методов метапоиска, от которых зависит 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)

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

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


person dhenze    schedule 11.07.2011    source источник


Ответы (5)


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

В итоге я пошел с:

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

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

person Anthony Wang    schedule 16.04.2016
comment
чтобы указать метку для заголовка, используйте @page_title = Lable. - person harshitpthk; 13.07.2016
comment
Это больше не работает (1.2.1). Представление отображается без какой-либо разметки. - person Anthony Wang; 13.07.2018

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

render active_admin_template('edit.html.arb'), :layout => false
person gsmendoza    schedule 06.04.2012
comment
Возможно, что-то изменилось в последней версии. Я получаю undefined method 'active_admin_template' - person Grant Birchmeier; 18.03.2015
comment
Как насчет: render 'admin/*resource_name*/*view_name*', :layout => false - person Ben; 13.02.2016

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

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).

person Derek    schedule 16.04.2014

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

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

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
person joselo    schedule 25.07.2011
comment
Почему вы создаете member_action для обновления? обновление включено в стандартные методы curd, поэтому попробуйте переопределить его в контроллере, например, контроллер do def update # ваши изменения end end - person Naveed; 31.05.2012

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

Во всяком случае, вот как я выше переопределял действие #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, чтобы действие create имело заполненный экземпляр модели как @user, прежде чем он сможет отобразить action => :new.

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

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

Вот этот метод класса 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
person armchairdj    schedule 21.12.2017