2012-12-03 13 views
45

我有一个activeadmin资源,它具有belongs_to:用户关系。Rails:activeadmin重写创建动作

当我在活动管理员中创建模型的新实例时,我想将当前登录的用户作为创建该实例的用户(我想象的非常标准的东西)。

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

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

不过;)我只是想知道这是如何工作?我只是希望分配@item变量的用户,然后调用超级将工作(和它)。我也开始浏览宝石,但看不到它是如何工作的。

任何指针将是巨大的。我假设这是InheritedResources给你的东西?

谢谢!

回答

91

我遇到类似的情况,我并不真的需要完全重写创建方法。我真的只想在保存之前注入属性,并且只能在创建时注入属性;非常类似于你的例子。通过ActiveAdmin源看完后,我决定,我可以用before_create做什么,我需要:

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

美丽的解决方案。应该被标记为接受的答案。 –

+1

只需要提一下'before_save'也适用,如果你还需要处理更新情况。 – BananaNeil

+0

是的,谢谢你提到这一点。 –

2

你是正确的活动管理使用InheritedResources,你可以在page结束时看到所有其他工具。

+2

妈的,在重新阅读docs正确(道歉为其他读者)...我应该叫做创建!而不是超级以上。虽然我认为它会做同样的事情。 –

11

另一种选择:

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

这适用于我试过的所有选项中的最佳选择 – DogEatDog