jfedick
jfedick

Reputation: 1362

How do I use instance variables, defined in the controller, in the view with ActiveAdmin?

I have this:

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

But when I load the page, I get an error saying:

undefined method `display_name' for nil:NilClass

which means that @user is nil. I am positive that @user is set appropriately (meaning the finder is getting appropriate data that exists in the db). I'm thinking it has something to with how ActiveAdmin works that I'm unfamiliar with. Any thoughts?

Also, I know I could do show do |user|, but there are more complicated things I am using this for and need access to the user object in the controller.

Upvotes: 17

Views: 9467

Answers (6)

Edmund Lee
Edmund Lee

Reputation: 2584

Instance variables are defined as helper methods. If you have that defined in your controller, you can access it. Alternatively, you can simply call resource, which will have reference to the active record object.

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

  show do
    attributes_table do
      row "User" do
        # note that your have access to `user` as a method.
        link_to user.display_name, user_path(user.slug) 
      end
    end
  end
end

Upvotes: 6

Jon Snow
Jon Snow

Reputation: 11890

If your goal is to set @user for the show action template, it's not necessary to do so, because active admin is already doing this for you.

If you use member_action, the @user object is there for you, it's called resource.

You can define a singleton method on your resource, it would be available in the view. This could make sense in some cases.

This is another way to pass information from the controller to the view.

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

Upvotes: 1

Alexis
Alexis

Reputation: 5085

Not entirely sure how selects the correct instance variable on the model, but, you could give pretty much any name to the instance variable, i test some cases and it seems that just looks for the one that haves the same model type when you don't specify it, to answer your other question, you have many ways to do it the simples one, just the same name as your instance variable, in your case,

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

the you have

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

and the last method i know, you have two escenarios, one for your active_admin files(.rb)

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

or in custom .arb views, like a form for a custom collection_action(same but direct access)

assigns[:user]

eg:

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

Like i say, i'm not sure how active_admin deals with instance variables, but a least you have multiple options, regards

Upvotes: 1

wpp
wpp

Reputation: 7333

Just in case someone else stumbles upon this:

controller.instance_variable_get(:@user)

should work as well.

Upvotes: 38

Jiemurat
Jiemurat

Reputation: 1639

There is controller in active admin, despite this you can not pass instance variable to arbre part. But you can use params hash for this:

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.: If you don't want to change params, then all instance variables are stored in @arbre_context.assigns. You may also do like:

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

Upvotes: 8

denis.peplin
denis.peplin

Reputation: 9881

It seems does not work that way in activeadmin. The only instance variable available inside "form" block is @config.

The best way to solve this issue is to use partials as described in "Customizing the Form"

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

Upvotes: 1

Related Questions