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

我们在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来显示我们的模型? 任何帮助表示赞赏。

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

我结束了:

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

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

在另一个stackoverflowpost中提到的解决方案有效:

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

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

 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)任何其他组合。

我也有同样的问题 :(

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

 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 

activeadmin文档对于如何覆盖标准控制器操作的细节非常清楚,考虑到源代码的不透明性,这是令人沮丧的。 gem中的许多内部设备似乎已经改变了版本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

我将自定义创建方法的内部结构作为我的模型上的类方法编写,因此我可以对其进行unit testing,并在我的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