【问题标题】:Rails: activeadmin overriding create actionRails:activeadmin 覆盖创建操作
【发布时间】:2012-11-20 11:26:49
【问题描述】:

我有一个 activeadmin 资源,它有一个 belongs_to :user 关系。

当我在活动管理员中创建模型的新实例时,我想将当前登录的用户关联为创建实例的用户(我想这是很标准的东西)。

所以...我得到了它的工作:

controller do
  def create
    @item = Item.new(params[:item])
    @item.user = current_curator
    super
  end 
end 

但是 ;) 我只是想知道这是如何工作的?我只是希望将@item 变量分配给用户然后调用 super 会起作用(确实如此)。我也开始查看 gem,但看不到它实际上是如何工作的。

任何指针都会很棒。我假设这是 InheritedResources 给你的东西?

谢谢!

【问题讨论】:

    标签: ruby-on-rails activeadmin inherited-resources


    【解决方案1】:

    我遇到了类似的情况,我真的不需要完全覆盖 create 方法。我真的只想在保存之前注入属性,并且只在创建时注入;与您的示例非常相似。在阅读了 ActiveAdmin 源代码后,我确定我可以使用before_create 来做我需要的事情:

    ActiveAdmin.register Product do
      before_create do |product|
        product.creator = current_user
      end
    end
    

    【讨论】:

    • 只想提一下before_save 如果您还需要处理更新案例也可以使用。
    【解决方案2】:

    另一种选择:

    def create
      params[:item].merge!({ user_id: current_curator.id })
      create!
    end
    

    【讨论】:

      【解决方案3】:

      您是正确的活跃管理员使用InheritedResources,您可以在page 的末尾看到所有其他工具。

      【讨论】:

      • 该死的,在正确地重新阅读文档后(对其他阅读本文的人表示歉意)......我应该打电话给创建!而不是超级上面。虽然我认为它会做同样的事情。
      【解决方案4】:

      根据 AA source code 这对我有用:

      controller do
        def call_before_create(offer)
        end
      end
      

      【讨论】:

      • 你从测试中提取了这个。它只是作为模型存在。这仅在您在注册资源中创建添加 call_before_create 方法时才有效。在这里,您可以看到他们将 call_before_create 方法用作测试的 muckup:github.com/activeadmin/activeadmin/blob/…
      猜你喜欢
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多