Defect #39862 » 0001-dynamic-object_type-routing-constraint-39862.patch
| config/routes.rb | ||
|---|---|---|
| 317 | 317 |
get 'attachments/download/:id', :to => 'attachments#download', :id => /\d+/ |
| 318 | 318 |
get 'attachments/thumbnail/:id(/:size)', :to => 'attachments#thumbnail', :id => /\d+/, :size => /\d+/, :as => 'thumbnail' |
| 319 | 319 |
resources :attachments, :only => [:show, :update, :destroy] |
| 320 |
constraints object_type: /(issues|versions|news|messages|wiki_pages|projects|documents|journals)/ do |
|
| 320 | ||
| 321 |
# register plugin object types with ObjectTypeConstraint.register_object_type(PluginModel.name.underscore.pluralize') |
|
| 322 |
constraints Redmine::Acts::Attachable::ObjectTypeConstraint do |
|
| 321 | 323 |
get 'attachments/:object_type/:object_id/edit', :to => 'attachments#edit_all', :as => :object_attachments_edit |
| 322 | 324 |
patch 'attachments/:object_type/:object_id', :to => 'attachments#update_all', :as => :object_attachments |
| 323 | 325 |
get 'attachments/:object_type/:object_id/download', :to => 'attachments#download_all', :as => :object_attachments_download |
| lib/plugins/acts_as_attachable/lib/acts_as_attachable.rb | ||
|---|---|---|
| 20 | 20 |
module Redmine |
| 21 | 21 |
module Acts |
| 22 | 22 |
module Attachable |
| 23 | ||
| 24 |
class ObjectTypeConstraint |
|
| 25 |
cattr_accessor :object_types |
|
| 26 | ||
| 27 |
self.object_types = Concurrent::Set.new(%w[ |
|
| 28 |
issues versions news messages wiki_pages projects documents journals |
|
| 29 |
]) |
|
| 30 | ||
| 31 |
class << self |
|
| 32 |
def matches?(request) |
|
| 33 |
request.path_parameters[:object_type] =~ param_expression |
|
| 34 |
end |
|
| 35 | ||
| 36 |
def register_object_type(type) |
|
| 37 |
object_types << type |
|
| 38 |
@param_expression = nil |
|
| 39 |
end |
|
| 40 | ||
| 41 |
def param_expression |
|
| 42 |
@param_expression ||= Regexp.new("^(#{object_types.join("|")})$")
|
|
| 43 |
end |
|
| 44 |
end |
|
| 45 |
end |
|
| 46 | ||
| 23 | 47 |
def self.included(base) |
| 24 | 48 |
base.extend ClassMethods |
| 25 | 49 |
end |
| test/fixtures/plugins/redmine_test_plugin_foo/init.rb | ||
|---|---|---|
| 5 | 5 |
version '0.0.1' |
| 6 | 6 |
end |
| 7 | 7 | |
| 8 |
Redmine::Acts::Attachable::ObjectTypeConstraint.register_object_type('plugin_articles')
|
|
| 9 | ||
| 8 | 10 |
Pathname(__dir__).glob("app/**/*.rb").sort.each do |path|
|
| 9 | 11 |
require path |
| 10 | 12 |
end |
| test/integration/routing/plugins_test.rb | ||
|---|---|---|
| 43 | 43 |
should_route 'GET /plugin_articles' => 'plugin_articles#index' |
| 44 | 44 |
should_route 'GET /bar_plugin_articles' => 'bar_plugin_articles#index' |
| 45 | 45 |
assert_equal("/bar_plugin_articles", plugin_articles_path)
|
| 46 |
should_route( |
|
| 47 |
'GET /attachments/plugin_articles/12/edit' => 'attachments#edit_all', |
|
| 48 |
object_id: '12', |
|
| 49 |
object_type: 'plugin_articles' |
|
| 50 |
) |
|
| 46 | 51 |
end |
| 47 | 52 |
end |