2011-12-30 11 views
6

mam to:Jak używać zmiennych instancji zdefiniowanych w kontrolerze w widoku z ActiveAdmin?

ActiveAdmin.register User do 
    controller do 
    def show 
     @user = User.find(params[:id]) 
     show! 
    end 
    end 

    show do 
    attributes_table do 
     row "User" do 
     link_to @user.display_name, user_path(@user.slug) 
     end 
    end 
    end 
end 

Ale kiedy załadować stronę, pojawia się błąd mówiąc:

undefined method `display_name' for nil:NilClass 

co oznacza, że ​​@user jest zerowa. Jestem przekonany, że @user jest ustawiony prawidłowo (co oznacza, że ​​wyszukiwarka otrzymuje odpowiednie dane, które istnieją w bazie danych). Myślę, że ma to coś wspólnego z tym, jak działa ActiveAdmin, którego nie znam. jakieś pomysły?

Ponadto, wiem, że mogłem zrobić show do |user|, ale są bardziej skomplikowane rzeczy, których używam i potrzebuję dostępu do obiektu użytkownika w kontrolerze.

Odpowiedz

1

Wygląda na to, że nie działa w ten sposób w activeadmin. Jedyną zmienną instancji dostępną w bloku "form" jest @config.

Najlepszym sposobem rozwiązania tego problemu jest użycie partials, jak opisano w rozdziale „Dostosowywanie postaci”

http://activeadmin.info/docs/5-forms.html

+0

Po wielu eksperymentach, zgadzam się. Nie myślałem o użyciu częściowego, aby dostosować formularz. Dzięki! – jfedick

5

Jest kontroler czynnie administrator mimo to nie możesz przejść instancji zmiennej ARBRE udział . Ale można użyć params mieszania do tego:

ActiveAdmin.register User do 
    controller do 
    def show 
     params[:user] = User.find(params[:id]) 
     show! 
    end 
    end 

    show do 
    attributes_table do 
     row "User" do 
     link_to params[:user].display_name, user_path(params[:user].slug) 
     end 
    end 
    end 
end 

P.S .: Jeśli nie chcesz zmieniać params, wówczas wszystkie zmienne instancji są przechowywane w @arbre_context.assigns. Można również zrobić tak:

link_to @arbre_context.assigns[:user].display_name, user_path(@arbre_context.assigns[:user].slug) 
21

na wszelki wypadek ktoś inny natyka się na to:

controller.instance_variable_get(:@user) 

powinien działać jak dobrze.

+2

To powinno być oznaczone jako poprawna odpowiedź – MilesStanfield

+2

Nie miałem pojęcia, że ​​'kontroler' jest rzeczą w AA. To rozwiązało wszystkie moje problemy, dzięki! –

+2

Idealne, działało przyjemnie! Nie wiedziałem, dlaczego zmienna my @users była zerowa w funkcji indeksu AA, ale użycie tego oznaczało, że nagle uzyskał wartości, których potrzebowałem i ustawił przed filtrem indeksu. Życie bezpieczniejsze! Dzięki –

0

Nie do końca pewna, w jaki sposób wybiera poprawną instancję zmiennej w modelu, ale można podać dowolną nazwę zmiennej instancji, testuję niektóre przypadki i wygląda na to, że szuka tylko tej, która ma ten sam typ modelu gdy nie podasz go, aby odpowiedzieć na inne pytanie, masz wiele sposobów, aby to zrobić simples jeden, tak samo jak nazwa twojej zmiennej instancji, w Twoim przypadku,

row :attr do 
    link_to user.display_name, admin_user_path(user) 
end  

masz

row :attr do |any_name| 
    link_to any_name.display_name, admin_user_path(any_name) 
end 

a ostatnia metoda wiem, masz dwie escenarios, jeden dla plików active_admin (.rb)

#eg: admin/user.rb 
@arbre_context.assigns[:user] 

lub w zwyczaju.arb widoki, takie jak formularz niestandardowego collection_action (ten sam, ale bezpośredni dostęp)

assigns[:user] 

np

#views/admin/users/new_invitation.html.arb(arbre) or html.erb 
active_admin_form_for assigns[:user], :url => send_invitation_admin_users_path do |user| 
.... 
end 
form_for assigns[:user], :url => send_invitation_admin_users_path do |user| 
.... 
end 
semantic_form_for assigns[:user], :url => send_invitation_admin_users_path do |user| 
..... 

Jak mówię, nie jestem pewien, jak active_admin dotyczy zmiennych instancji, ale przynajmniej masz wiele opcji, dotyczy

0

Jeśli Twoim celem jest ustawienie @user dla szablonu akcji, nie musisz tego robić, ponieważ aktywny administrator już to robi.

Jeśli używasz member_action, obiekt @user jest dla ciebie, nazywa się resource.

Możesz zdefiniować pojedynczą metodę na swoim resource, będzie ona dostępna w widoku. W niektórych przypadkach może to mieć sens.

To jest kolejny sposób przekazywania informacji z kontrolera do widoku.

member_action :show, method: :get do 
    resource.instance_eval do 
     define_singleton_method('language') do 
      'English' 
     end 
    end 
end 

show do 
    attributes_table do 
     row :name 
     row :email 
     row :id 
     row :language 
    end 
end 
Powiązane problemy