2012-12-03 21 views
45

Mam zasób activeadmin, który ma związek belongs_to: user.Szyny: activeadmin przesłanianie tworzenia akcji

Kiedy utworzę nową instancję modelu w aktywnym administratorze, chcę skojarzyć aktualnie zalogowanego użytkownika jako użytkownika, który utworzył instancję (całkiem standardowe rzeczy, jakie sobie wyobrażam).

Więc ... Mam to pracować:

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

jednak;) Zastanawiam się, jak to działa? Miałem tylko nadzieję, że przypisanie zmiennej @item użytkownika, a następnie wywołanie super, zadziała (i będzie działać). Zacząłem też przeglądać klejnot, ale nie mogłem zobaczyć, jak to działa.

Wszelkie wskaźniki byłyby świetne. Zakładam, że jest to coś, co daje Ci InheritedResources?

Dzięki!

Odpowiedz

91

Pobiegłem do podobnej sytuacji, gdzie tak naprawdę nie trzeba całkowicie zastąpić metodę tworzenia. Naprawdę chciałem tylko wstrzyknąć właściwości przed zapisaniem i tylko przy tworzeniu; bardzo podobny do twojego przykładu. Po przeczytaniu przez źródło ActiveAdmin, uznałem, że mogę używać before_create robić to, co potrzebne:

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

Piękne rozwiązanie. Powinien być oznaczony jako zaakceptowana odpowiedź. –

+1

Chcemy tylko wspomnieć, że 'before_save' działa również, jeśli potrzebujesz obsługiwać również aktualizację. – BananaNeil

+0

Tak, dzięki za wzmiankę o tym. –

2

Masz rację aktywny admin use InheritedResources, wszystkie inne narzędzia można zobaczyć na końcu page.

+2

Cholera, po ponownym przeczytaniu Dokumenty poprawnie (przepraszania dla każdego, kto to czyta) ... powinienem zadzwonić, aby utworzyć! zamiast super powyżej. Chociaż myślę, że zrobi to samo. –

11

Inna opcja:

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

To działa najlepiej ze wszystkich opcji, jakie wypróbowałem. – DogEatDog