1

I'm using rails_admin to email all users when a button is clicked. The action is called twice instead of once.

lib/rails_admin_email_everyone.rb:

require 'rails_admin/config/actions'
require 'rails_admin/config/actions/base'


module RailsAdmin
  module Config
    module Actions
      class EmailEveryone < RailsAdmin::Config::Actions::Base
        register_instance_option :visible? do
          authorized?
        end

        register_instance_option :link_icon do
          'icon-envelope'
        end

        register_instance_option :collection? do
          true
        end

        register_instance_option :member? do
          false
        end

        register_instance_option :controller do
          Proc.new do
            @topics_with_owners = Topic.where('user_id IS NOT NULL')

            @topics_with_owners.each do |topic|              
              @reminder = Reminder.new(:topic_id=> topic.id, 
                :to_user_id => student.id, :from_user_id => current_user.id)
              if @reminder.save
                TopicMailer.reminder(@reminder.topic).deliver
                @reminder.update_attribute(:sent, true)
              else
                logger.error "Error sending email reminder: "
                  + @reminder.errors.full_messages.map {|msg| msg}.join(',')
              end
            end

            flash[:success] = "Reminders successfully sent."

            redirect_to back_or_index
          end
        end
      end
    end
  end
end  

config/initializers/rails_admin.rb:

require Rails.root.join('lib', 'rails_admin_email_everyone.rb')
RailsAdmin.config do |config|
  config.authenticate_with do
    redirect_to(main_app.root_path, flash: 
     {warning: "You must be signed-in as an administrator to access that page"}) 
     unless signed_in? && current_user.admin?
  end

  module RailsAdmin
    module Config
      module Actions
        class EmailEveryone < RailsAdmin::Config::Actions::Base
          RailsAdmin::Config::Actions.register(self)
        end
      end
    end
  end

  config.actions do
    # root actions
    dashboard                     # mandator y
    # collection actions
    index                         # mandatory
    new
    export
    history_index
    bulk_delete
    # member actions
    show
    edit
    delete
    history_show
    show_in_app

    email_everyone do
      visible do
        bindings[:abstract_model].model.to_s == "Reminder"
      end
    end
  end
end

When I examine my log I see it executes twice, but with slightly different parameters. One including pjax. I found this stackoverflow question relating a similar issue to the pjax timeout:

Started GET "/admin/reminder/email_everyone?_pjax=%5Bdata-pjax-container%5D" for 127.0.0.1 at 2012-12-01 20:28:12 -0900
Processing by RailsAdmin::MainController#email_everyone as HTML
  Parameters: {"_pjax"=>"[data-pjax-container]", "model_name"=>"reminder"}
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Topic Load (1.3ms)  SELECT "topics".* FROM "topics" WHERE (user_id IS NOT NULL)
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
   (0.2ms)  BEGIN
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Topic Load (0.5ms)  SELECT "topics".* FROM "topics" WHERE "topics"."id" = 4398 LIMIT 1
  SQL (6.5ms)  INSERT INTO "reminders" ("created_at", "from_user_id", "sent", "topic_id", "to_user_id", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["created_at", Sun, 02 Dec 2012 05:28:12 UTC +00:00], ["from_user_id", 1], ["sent", false], ["topic_id", 4398], ["to_user_id", 1], ["updated_at", Sun, 02 Dec 2012 05:28:12 UTC +00:00]]
   (1.1ms)  COMMIT
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Rendered topic_mailer/reminder.text.erb (375.8ms)


Started GET "/admin/reminder/email_everyone" for 127.0.0.1 at 2012-12-01 20:28:14 -0900
Processing by RailsAdmin::MainController#email_everyone as HTML
  Parameters: {"model_name"=>"reminder"}
  User Load (0.8ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Topic Load (1.1ms)  SELECT "topics".* FROM "topics" WHERE (user_id IS NOT NULL)
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
   (0.2ms)  BEGIN
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  CACHE (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Topic Load (0.5ms)  SELECT "topics".* FROM "topics" WHERE "topics"."id" = 4398 LIMIT 1
  SQL (7.1ms)  INSERT INTO "reminders" ("created_at", "from_user_id", "sent", "topic_id", "to_user_id", "updated_at") VALUES ($1, $2, $3, $4, $5, $6) RETURNING "id"  [["created_at", Sun, 02 Dec 2012 05:28:14 UTC +00:00], ["from_user_id", 1], ["sent", false], ["topic_id", 4398], ["to_user_id", 1], ["updated_at", Sun, 02 Dec 2012 05:28:14 UTC +00:00]]
   (1.0ms)  COMMIT
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
  Rendered topic_mailer/reminder.text.erb (368.9ms)
Community
  • 1
  • 1
rboone
  • 521
  • 5
  • 10

2 Answers2

3

I found the same issue,

I just added following code into lib/rails_admin_custom_action.rb

i.e Added pjax? option to false

module RailsAdmin
  module Config
    module Actions
      class EmailEveryone < RailsAdmin::Config::Actions::Base

         register_instance_option :pjax? do
           false
         end 

       end
     end
   end
 end

may this will help you..

Amol Udage
  • 2,917
  • 19
  • 27
0

There's a pull request marked as good to merge that creates a pjax option for rails_admin. Unfortunately, it requires tests and there hasn't been any action for 3 months:
https://github.com/sferik/rails_admin/pull/1295

rboone
  • 521
  • 5
  • 10