Home » Ruby » Rails 3. How to add a helper that ActiveAdmin will use?

Rails 3. How to add a helper that ActiveAdmin will use?

Posted by: admin November 30, 2017 Leave a comment

Questions:

I’m creating a helper to be used by Formtastic but I get the undefined local variable or method error. I don’t know where to put it so it can work.

I already tried in the application_helper.rb and in app/helpers/active_admin/view_helpers.rb

Answers:

You can define them in app/helpers/ as you tried but you need to include them trough the active admin’s initializer like this:

# in config/initializers/active_admin.rb
ActiveAdmin.setup do |config|
    ....
end

module ActiveAdmin::ViewHelpers
  include ApplicationHelper
end

Questions:
Answers:

You need to put your helper functions in app/helpers/active_admin/views_helper.rb file
Example:

module ActiveAdmin::ViewsHelper #camelized file name
  def my_helper 
       # do something 
  end 
end 

Questions:
Answers:

What I have found using ActiveAdmin 0.6.1 is that ActiveAdmin will look for helpers in app/helpers/active_admin/*_helper.rb, but the name doesn’t really matter.

What does matter is:

  1. the filename must end in “_helper.rb”
  2. the module name must be the camel-case of the file name
  3. the file must be in app/helpers/active_admin/ directory.

If anyone knows where this is officially documented, that would be awesome.

Here is an example: https://gist.github.com/afred/7035a657e8ec5ec08d3b

Questions:
Answers:
app/helpers/active_admin/view_helpers.rb

didn’t help me

EDITED: i changed it to views_helper.rb & ViewsHelper accordingly and it worked

*but if you want to define it only for certain resource, you can do it in my way


i had to define

#app/helpers/active_admin/categories_helper.rb

module ActiveAdmin::CategoriesHelper

  def helper_method

  end

end

for my active_admin resource app/admin/categories.rb

Questions:
Answers:

I can make it work in ActiveAdmin 0.6.1 (finally!). The solution is to create a helper module as following:

# app/helpers/active_admin_helpers.rb
module ActiveAdminHelpers
  # make this method public (compulsory)
  def self.included(dsl)
    # nothing ...
  end

  # define helper methods here ...
  def helper_method
    ...
  end
end

then include this module this way:

# app/admin/[resource].rb
include ActiveAdminHelpers

ActiveAdmin.register [Resource] do
  ...

end

Actually, it’s not a nice solution but it’s DRY and working good. I have already read and tried a lot of methods and solutions such as ViewHelpers module (put under ‘app/helpers’ or ‘app/admin/active_admin’), ActiveAdmin::DSL monkey patching, … but those never worked in version 0.6.1 (I don’t have any ideas about other versions) 🙁

Questions:
Answers:

Defining ActiveAdmin::ViewHelpers in app/admin/active_admin/view_helpers.rb works for me with activeadmin 0.3.4 and 0.5.0.

Questions:
Answers:

Using activeadmin 1.0.0.pre1 from git://github.com/activeadmin/activeadmin.git

Rails 4.2.1

This worked for me…

my_app/app/helpers/active_admin/resources_helper.rb

module ActiveAdmin
  module ResourcesHelper
    def resource_form_for(_resource, _params, _options = {}, &_block)
      url = if _resource.new_record?
              UrlBuilder.resources_path(_resource.class, _params)
            else
              UrlBuilder.resource_path(_resource.class, _params)
            end

      method = _resource.new_record? ? :post : :put

      options = { url: url, method: method, builder: ActiveAdmin::FormBuilder }
      options.merge!(_options)

      semantic_form_for([:admin, _resource], options) do |f|
        _block.call(f)
      end
    end
  end
end

my_app/app/admin/balance_sheets.rb

ActiveAdmin.register BalanceSheet do
  form partial: 'form'
end

my_app/app/views/admin/balance_sheets/_form.html.erb

<%= resource_form_for(resource, params) do |f| %>
  <%= f.inputs "Fields" do %>
    <%= f.input :progress_status %>
    <%= f.input :crew %>
    <%= f.input :shift %>
    <%= f.input :expected_progress %>
    <%= f.input :real_progress %>
    <%= f.input :analyst, collection: User.analysts %>
    <%= f.input :activity_ids, as: :check_boxes, collection: Activity.balance_sheet_activities %>
    <%= f.input :worker_ids, as: :check_boxes, collection: Worker.all %>
  <% end %>
  <%= f.actions %>
<% end %>

Questions:
Answers:

You can also use ActiveAdmin partials :

render partial: 'admin/my_partial', locals: { var: my_var }

And inside app/views/admin/_my_partial.html.arb your active_admin ruby code.

Questions:
Answers:

What worked for me with Rails 3.2.11 and and gem activeadmin (0.5.1) was not adding the app/active_admin/view_helpers.rb file, or declaring any modules in config/initializers/active_admin.rb

I put my helpers logically, by model, into the app/*_helpers.rb files. Then inside the app/admin/model.rb file I used:

# app/admin/[resource].rb
ActiveAdmin.register [Resource] do
  ...
  filter :gender, as: :select, collection: proc{genders}
  ...
end

To use the helper in filters, to display a drop down list of genders to filter on, in the list view. For the corresponding create form fields, I used:

# app/admin/[resource].rb
ActiveAdmin.register [Resource] do
  form do |f|
    f.inputs "Case Manager" do
      ...
      f.input :gender, as: :radio, collection: genders
      ...
      f.buttons
    end
  end
end

To display radio buttons for the input form.

Not sure why the proc{} is required outside of the form do |f| block, but if anyone can explain why it’s a bad idea, I’ll find a different way.

Questions:
Answers:

Another way to do this is to make the specific ActiveAdmin controller generated behind-the-scenes include the helper. This method will allow making the inclusion of the helpers explicit per file rather than global.

ActiveAdmin.register MyModel do
  controller do
    include MyHelper
  end
end