2011-12-30 7 views
6

tengo esto:¿Cómo uso variables de instancia, definidas en el controlador, en la 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 

Pero cuando me carga la página, me sale un error que dice:

undefined method `display_name' for nil:NilClass 

lo que significa que @user es nula. Estoy seguro de que @user está configurado apropiadamente (lo que significa que el buscador está obteniendo datos apropiados que existen en el db). Estoy pensando que tiene algo que ver con el funcionamiento de ActiveAdmin que no conozco. ¿Alguna idea?

Además, sé que podría hacer show do |user|, pero hay cosas más complicadas para las que estoy usando esto y necesito acceso al objeto de usuario en el controlador.

Respuesta

1

Parece que no funciona de esa manera en activeadmin. La única variable de instancia disponible dentro del bloque "formulario" es @config.

La mejor manera de resolver este problema es utilizar parciales como se describe en "Cómo personalizar la forma"

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

+0

Después de mucha experimentación, estoy de acuerdo. Sin embargo, no pensé en usar un parcial para personalizar el formulario. ¡Gracias! – jfedick

5

Hay controlador de administración activa, a pesar de esto no se puede pasar variable de instancia a arbre parte . Pero se puede usar params hash de esta:

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 .: Si no desea cambiar params, a continuación, todas las variables de instancia se almacenan en @arbre_context.assigns. También puede hacer como:

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

Sólo en caso de que alguien se topa con esta:

controller.instance_variable_get(:@user) 

debería funcionar tan bien.

+2

Esto debería marcarse como la respuesta correcta – MilesStanfield

+2

No tenía idea de que 'controller' era una cosa en AA. Esto ha resuelto todos mis problemas, ¡gracias! –

+2

Perfecto, trabajado un placer! No sabía por qué mi variable @users era nula en la función Índice AA, pero usar esto significaba que de repente tenía los valores que necesitaba y que había establecido en un filtro de índice anterior. ¡Vida mas segura! Gracias –

0

No estoy del todo seguro de cómo se selecciona la variable de instancia correcta en el modelo, pero se puede dar cualquier nombre a la variable de instancia, pruebo algunos casos y parece que solo busca el que tiene el mismo tipo de modelo cuando no se especifica que, para responder a su otra pregunta, usted tiene muchas maneras de hacer que la simples uno, sólo el mismo nombre que la variable de instancia, en su caso,

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

la que tiene

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

y el último método que conozco, tiene dos Escenarios, una para sus archivos active_admin (.RB)

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

o en la costumbre.arb vistas, como una forma de collection_action a medida (igual pero el acceso directo)

assigns[:user] 

por ejemplo:

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

Como digo, no estoy seguro de cómo active_admin se ocupa de las variables de instancia, sino una al menos tiene múltiples opciones, saludos

0

Si su objetivo es establecer @user para la plantilla de acción show, no es necesario hacerlo, porque el administrador activo ya lo está haciendo por usted.

Si usa member_action, el objeto @user está a su disposición, se llama resource.

Puede definir un método singleton en su resource, estaría disponible en la vista. Esto podría tener sentido en algunos casos.

Esta es otra forma de pasar información del controlador a la 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 
Cuestiones relacionadas