2011-12-30 8 views
6

ho questo:Come utilizzare variabili di istanza, definite nel controller, nella vista con 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 

Ma quando carico della pagina, ottengo un errore che dice:

undefined method `display_name' for nil:NilClass 

il che significa che @user è pari a zero. Sono sicuro che @user sia impostato in modo appropriato (nel senso che il finder sta ottenendo dati appropriati che esistono nel db). Sto pensando che abbia qualcosa con come funziona ActiveAdmin che non conosco. qualche idea?

Inoltre, so che potrei fare show do |user|, ma ci sono cose più complicate che sto usando per questo e ho bisogno di accedere all'oggetto utente nel controller.

risposta

1

Sembra non funziona in questo modo in activeadmin. L'unica variabile di istanza disponibile nel blocco "form" è @config.

Il modo migliore per risolvere questo problema è quello di utilizzare parziali come descritto in "Personalizzare il Form"

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

+0

Dopo un sacco di sperimentazione, sono d'accordo. Non pensavo di utilizzare un parziale per personalizzare il modulo però. Grazie! – jfedick

5

C'è controller di amministrazione attiva, nonostante questo non è possibile passare variabile di istanza di arbre parte . Ma è possibile utilizzare params hash per questo:

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 .: Se non si desidera modificare params, allora tutte le variabili di istanza sono memorizzati in @arbre_context.assigns. Si può anche fare come:

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

in caso qualcuno altro inciampa su questo:

controller.instance_variable_get(:@user) 

dovrebbe funzionare pure.

+2

Questo dovrebbe essere contrassegnato come la risposta corretta – MilesStanfield

+2

Non avevo idea che 'controller' era una cosa in AA. Questo ha risolto tutti i miei problemi, grazie! –

+2

Perfetto, ha funzionato a meraviglia! Ero in perdita sul motivo per cui la mia variabile @users era nulla nella funzione Index AA, ma usando questo significava che all'improvviso aveva i valori che avevo bisogno e che aveva impostato in un filtro indice precedente. Vita più sicura! Grazie –

0

Non è del tutto sicuro come si seleziona la variabile di istanza corretta sul modello, ma, si può dare praticamente qualsiasi nome alla variabile di istanza, io prova alcuni casi e sembra che si cerchi quello che ha lo stesso tipo di modello quando non si specifica che, per rispondere alla tua altra domanda, si hanno molti modi per farlo l'simples uno, proprio lo stesso nome del tuo variabile di istanza, nel tuo caso,

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

l'hai

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

e l'ultimo metodo che conosco, si hanno due escenarios, uno per i file active_admin (.RB)

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

o in costume.vista ARB, come una forma di collection_action personalizzato (lo stesso, ma l'accesso diretto)

assigns[:user] 

esempio:

#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| 
..... 

Come ho detto, io non sono sicuro di come active_admin occupa di variabili di istanza, ma un almeno hai più opzioni, per quanto riguarda

0

Se il tuo obiettivo è impostare @user per il modello di azione show, non è necessario farlo, perché l'amministratore attivo sta già facendo questo per te.

Se si utilizza member_action, l'oggetto @user è lì per te, si chiama resource.

È possibile definire un metodo Singleton su resource, che sarà disponibile nella vista. Questo potrebbe avere senso in alcuni casi.

Questo è un altro modo per passare le informazioni dal controller alla vista.

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 
Problemi correlati