2011-07-11 85 views
6

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

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

这给了我们一个错误抱怨缺少模板“缺少模板管理/ order_processes /显示用......”

我们还试图拨打

render renderer_for(:show) 

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

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

回答

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

为什么你更新制作member_action?更新包含在标准凝乳方法,以便尽量覆盖它在控制器 e.g 控制器也 高清更新 #更改 结束 结束 – Naveed

2

this other stackoverflow post提到的解决方案工作:

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

可能会在最近的版本已经改变。我得到'undefined method'active_admin_template'' –

+1

怎么样:'render'admin/* resource_name */* view_name *',:layout => false' – Ben

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

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

我结束了去:

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

这似乎工作,虽然你将不得不供应标题标签,显示为“翻译丢失:en.active_admin [your_action] _model“

+1

为标题提供标签use @page_title =“Lable”。 – harshitpthk

0

activeadmin文档对于如何重写标准控制器操作的具体细节非常清楚,这是令人沮丧的,因为源代码有多不透明。许多内置的宝石似乎已经改变了1.0版本,这使得很多旧的堆栈溢出答案不可用。

无论如何,这里是我如何重写我的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 

值得一提的是activeadmin预计,如果你的模型是用户,为创建行动,有一个填充模型实例作为@user它可以使action => :new之前。

我在我的模型中编写了自定义创建方法的内部结构作为类方法,因此我可以对它进行单元测试并尽可能在代码中隐藏尽可能少的代码。

对于上下文,我需要重写此操作,因为我正在使用Devise,并且我想让我的管理员使用临时密码和自定义欢迎电子邮件创建用户帐户,而不是使用内置的可确认电子邮件,创建帐户。

下面是用户类方法:

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 
相关问题