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

时间:2011-07-11 16:06:38

标签: ruby-on-rails admin

我们在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

这给我们一个错误抱怨缺少模板“缺少模板admin / order_processes / show with ...”

我们也试过打电话

  render renderer_for(:show)

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

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

5 个答案:

答案 0 :(得分:3)

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

我最终选择了:

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

似乎有效,但您必须为标题提供标签,该标签显示为“缺少翻译:en.active_admin。[your_action] _model”

答案 1 :(得分:2)

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

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

答案 2 :(得分: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)的任何其他组合无效。

答案 3 :(得分: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

答案 4 :(得分: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