ActiveAdmin - 如何在自定义操作中呈现默认模板

问题描述 投票:6回答:5

我们在Rails3应用程序中使用ActiveAdmin作为默认模型。现在我们需要覆盖show动作。 OrderProcess模型是一个瞬态(无表格)模型,这意味着所有字段都是从其他数据聚合而来的。我们使用一个内部模块,它提供了模拟ActiveAdmin依赖的MetaSearch方法的必要方法。以下是我们如何覆盖show动作:

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

这给了我们一个错误抱怨丢失模板“缺少模板管理员/订单_过程/显示...”的错误

我们也试着打电话

  render renderer_for(:show)

但这产生了一个关于缺少方法model_name的错误,这可能是由于我们的模型是无表格和关注模块。

我们如何使用内置渲染方法的ActiveAdmins来显示我们的模型?任何帮助表示赞赏。

ruby-on-rails admin
5个回答
3
投票

刚碰到这个...格兰特的评论是正确的,active_admin_template不再存在(我在1.0.0-pre2)。

我结束了:

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

这似乎有效,虽然你必须为标题提供一个标签,显示为“缺少翻译:en.active_admin。[your_action] _model”


2
投票

this other stackoverflow post提到的解决方案有效:

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

2
投票

我有一个类似的问题,我需要覆盖更新操作的默认活动管理控制器行为。我让它像这样工作:

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
投票

我也有同样的问题 :(

我正在尝试覆盖更新操作并尝试呈现“编辑操作”

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
投票

activeadmin文档非常清楚如何覆盖标准控制器操作的细节,考虑到源代码的不透明性,这是令人沮丧的。宝石中的许多内部似乎已经改变了版本1.0,这使得许多旧的Stack Overflow答案无法使用。

无论如何,这是我在上面覆盖我的activeadmin控制器中的#create动作(在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

值得注意的是,如果您的模型是User,则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
© www.soinside.com 2019 - 2024. All rights reserved.