diff --git a/app/controllers/resque_web/application_controller.rb b/app/controllers/resque_web/application_controller.rb
index fb40424..c725fae 100644
--- a/app/controllers/resque_web/application_controller.rb
+++ b/app/controllers/resque_web/application_controller.rb
@@ -1,5 +1,6 @@
module ResqueWeb
class ApplicationController < ActionController::Base
+ include ActionView::Helpers::TextHelper
protect_from_forgery
before_filter :set_subtabs, :authorize
diff --git a/app/controllers/resque_web/jobs_controller.rb b/app/controllers/resque_web/jobs_controller.rb
new file mode 100644
index 0000000..d68d1fc
--- /dev/null
+++ b/app/controllers/resque_web/jobs_controller.rb
@@ -0,0 +1,12 @@
+module ResqueWeb
+ class JobsController < ApplicationController
+
+ def destroy
+ args = JSON.parse(params[:args])
+ destroyed = Resque::Job.destroy(params[:queue], params[:job_class], *args)
+ flash[:info] = "#{pluralize(destroyed, 'job')} deleted."
+ redirect_to queue_path(params[:queue])
+ end
+
+ end
+end
diff --git a/app/views/layouts/resque_web/application.html.erb b/app/views/layouts/resque_web/application.html.erb
index ab50b80..c64a63d 100644
--- a/app/views/layouts/resque_web/application.html.erb
+++ b/app/views/layouts/resque_web/application.html.erb
@@ -44,6 +44,9 @@
<% end %>
+ <% flash.each do |key, message| %>
+
<%= message %>
+ <% end %>
<%= yield %>
diff --git a/app/views/resque_web/queues/show.html.erb b/app/views/resque_web/queues/show.html.erb
index 9df15bf..3f4c397 100644
--- a/app/views/resque_web/queues/show.html.erb
+++ b/app/views/resque_web/queues/show.html.erb
@@ -13,11 +13,20 @@
| <%= job['class'] %> |
<%=h job['args'].inspect %> |
+
+ <%= form_tag(job_path(job['class']), :method => :delete) do %>
+ <%= hidden_field_tag :queue, params[:id] %>
+ <%= hidden_field_tag :job_class, job['class'] %>
+ <%= hidden_field_tag :args, JSON.dump(job['args']) %>
+ <%= submit_tag "Delete", :class => 'btn btn-default' %>
+ <% end %>
+ |
<% end %>
<% if queue_jobs.empty? %>
diff --git a/config/routes.rb b/config/routes.rb
index 10c0644..895c371 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -9,6 +9,7 @@
resource :overview, :only => [:show], :controller => :overview
resources :working, :only => [:index]
+ resources :jobs, :only => [:destroy], param: :job_class
resources :queues, :only => [:index,:show,:destroy], :constraints => {:id => id_pattern} do
member do
put 'clear'
diff --git a/test/functional/jobs_controller_test.rb b/test/functional/jobs_controller_test.rb
new file mode 100644
index 0000000..23e3a72
--- /dev/null
+++ b/test/functional/jobs_controller_test.rb
@@ -0,0 +1,45 @@
+require 'test_helper'
+
+module ResqueWeb
+ class JobsControllerTest < ActionController::TestCase
+ include ControllerTestHelpers
+
+ let(:queue_name) { 'example_queue' }
+ let(:args) { ['foo', 'bar'] }
+ let(:params) { { queue: queue_name, job_class: 'ExampleJob', args: JSON.dump(args)} }
+
+ setup do
+ @routes = Engine.routes
+ Resque.push(queue_name, class: 'ExampleJob', args: args)
+ @queue_size = Resque.size(queue_name)
+ end
+
+ teardown do
+ Resque.remove_queue(queue_name)
+ end
+
+ describe "DELETE /destroy" do
+ let(:params_without_args) do
+ params.merge(:args => JSON.dump([]))
+ end
+
+ it "deletes a job having the specified arguments" do
+ visit(:destroy, params, method: :delete)
+ new_queue_size = Resque.size(queue_name)
+ assert_equal((@queue_size - 1), new_queue_size)
+ end
+
+ it "deletes all jobs of a class if no args are specified" do
+ Resque.push(queue_name, class: 'ExampleJob')
+ visit(:destroy, params_without_args, method: :delete)
+ new_queue_size = Resque.size(queue_name)
+ assert_equal(0, new_queue_size)
+ end
+
+ it "redirects to the queue's show page" do
+ visit(:destroy, params, method: :delete)
+ assert_redirected_to queue_path(queue_name)
+ end
+ end
+ end
+end