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

Ruby on rails ActiveAdmin-如何在自定义操作中呈现默认模板,ruby-on-rails,admin,Ruby On Rails,Admin,我们在Rails3应用程序中为默认模型使用ActiveAdmin。现在我们需要覆盖显示操作。OrderProcess模型是一个瞬态(无表)模型,这意味着所有字段都是从其他数据聚合而来的。我们使用一个内部模块,提供必要的方法来模拟ActiveAdmin所依赖的元搜索方法。以下是覆盖“显示”操作的方式: ActiveAdmin.register OrderProcess do member_action :show, :method => :get do @order_proc

我们在Rails3应用程序中为默认模型使用ActiveAdmin。现在我们需要覆盖显示操作。OrderProcess模型是一个瞬态(无表)模型,这意味着所有字段都是从其他数据聚合而来的。我们使用一个内部模块,提供必要的方法来模拟ActiveAdmin所依赖的元搜索方法。以下是覆盖“显示”操作的方式:

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_名称的错误,这可能是由于我们的模型是无表的,并且模块是相关的

我们如何使用ActiveAdmins内置的呈现方法来显示我们的模型?非常感谢您的帮助。

我也有同样的问题:(

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

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
在会议上提到的解决方案有效:


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

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

不适用于我或(:edit)

的任何其他
渲染器组合刚刚遇到此问题…Grant的评论是正确的,
活动管理模板
不再存在(我在1.0.0-pre2上)

我最终选择了:

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


虽然您必须为标题提供一个标签,该标签显示为“translation missing:en.active\u admin.[your\u action]\u model”,但这似乎是可行的

activeadmin文档对如何覆盖标准控制器操作的细节非常清晰,考虑到源代码的不透明性,这一点令人沮丧。gem中的许多内部构件似乎在1.0版中发生了大量变化,这使得许多旧的堆栈溢出答案无法使用

无论如何,下面是我如何在我的activeadmin控制器(在Rails 4.2.x上)中重写#create操作的:

值得注意的是,如果您的模型是User,那么activeadmin希望create操作在呈现
action=>:new
之前将填充的模型实例作为@User

我在模型上以类方法的形式编写了自定义create方法的内部构件,以便对其进行单元测试,并在activeadmin代码中尽可能少地嵌入代码

在上下文中,我需要覆盖此操作,因为我使用的是Desive,我想让管理员使用临时密码和自定义欢迎电子邮件创建用户帐户,而不是为自己创建的帐户创建内置的:可确认电子邮件

下面是该用户类方法:

  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

为什么要为更新创建成员操作?更新包含在标准curd方法中,因此请尝试在控制器中覆盖它,例如控制器do def update#您的更改结束端可能在最近的版本中发生了更改。我得到了
未定义的方法“active\u admin\u template”
如何:
呈现“admin/*resource\u name*/*view\u name*“,:layout=>false
要为标题提供标签,请使用@page_title=“Lable”。这不再有效(1.2.1)。视图呈现时根本没有任何布局。
  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
  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