活动管理员传递params after_initialize

时间:2013-09-21 20:37:09

标签: ruby-on-rails ruby ruby-on-rails-3 activeadmin

作为一名Rails新手,我几天来一直在努力解决Activeadmin问题,而我却无法弄清楚如何解决它。

由于各种原因,我需要在显示新Invoice对象的表单时构建对象。我有路线

“admin/orders/:order_id/invoices/new" => "admin/invoices#new"

并且需要在显示Invoice表单时构建订单对象。在有人指出ActiveAdmin可以通过设置ActiveAdmin has_many来做到这一点之前,是的,我知道情况确实如此,但鉴于我的模型结构,这不适合这个应用程序(除此之外,并非所有发票都有链接的订单)。

所以,我在我的Invoice模型上设置了after_initialize,如下所示:

  after_initialize :set_defaults

  def set_defaults
   @ordergroup = Ordergroup.new
   @ordergroup.order = Order.find(@options[:order_id]) 
   self.ordergroup << @ordergroup
  end

Simples。唯一的问题是将参数中的order_id传递给模型。我一直在尝试一系列初始化功能,但无论我做什么似乎都会导致完全的灾难。有人能指出我正确的方向吗?如果这不是Activeadmin,而我直接调用新的Invoice,我可以使用Invoice.new(params),但是使用Activeadmin,这似乎是作为表单函数的一部分自动调用的。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

答案似乎只是跳过所有的after_initialize并初始化麻烦并在Activeadmin中重写新方法

admin/invoice.rb

def new
  @invoice = Invoice.new
  if params[:order_id]
    @invoice.linknew(params[:order_id])
  end
end

invoice.rb

  def linknew(order_id = {})
    @order_id = order_id
    @ordergroup = Ordergroup.new
    @ordergroup.order = Order.find(@order_id)
    self.ordergroup << @ordergroup
  end

我花了两天时间才弄明白......