1

单击按钮时,我正在使用 rails_admin 向所有用户发送电子邮件。该动作被调用两次而不是一次。

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  

配置/初始化程序/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

当我检查我的日志时,我看到它执行了两次,但参数略有不同。一个包括 pjax。我发现这个stackoverflow 问题与 pjax 超时类似的问题有关:

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)
4

2 回答 2

3

我发现了同样的问题,

我刚刚将以下代码添加到 lib/rails_admin_custom_action.rb

即添加了pjax?选项为假

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

         register_instance_option :pjax? do
           false
         end 

       end
     end
   end
 end

这可能会帮助你..

于 2015-11-17T13:21:52.187 回答
0

有一个标记为可合并的拉取请求,它为 rails_admin 创建了一个 pjax 选项。不幸的是,它需要测试并且 3 个月没有任何行动:
https ://github.com/sferik/rails_admin/pull/1295

于 2012-12-02T07:13:04.857 回答