Rails. TinyMCE ImageUpload is requesting GET instead of POST as in Development

321 Views Asked by At

I am working on rails using TinyMCE Imageupload.

It works just fine in Development (funny enough it used to work also in Production). The problem is that on production it issues the wrong GET request:

ActionController::RoutingError (No route matches [GET] "/at/tinymce_assets"):

Two issues here: Firstly - it puts a locale in front, secondly it uses a GET request.

On development however it works fine:

Started POST "/tinymce_assets" for 127.0.0.1 at 2015-09-27 02:33:10 +0200
Processing by TinymceAssetsController#create as HTML

My routes.rb looks like this:

Rails.application.routes.draw do

  root to: 'static_pages#redirect'

  localized do

    match '',    to: 'static_pages#welcome', :as => 'welcome',    via: 'get'

    ... lots of other stuff ...

  end

  match '*path', to: redirect("/#{I18n.locale}/%{path}"), constraints: lambda { |req| !req.path.starts_with? "/#{I18n.default_locale}/" }, via: 'get'
  post '/tinymce_assets/' => 'tinymce_assets#create', :trailing_slash => false
end

I am adding here the :trailing_slash => false - as it is set to true in environment.rb

Question:

Why does the production to site decide to fire a GET request + adding the locale, but the development does everything its supposed to do? Where can I set this behaviour ?

UPDATE - ADDING ADDITIONAL INFORMATION

After placing the post above my localized section I still get the same error - here the full trace:

I, [2015-09-28T16:32:07.614317 #6136]  INFO -- : Started GET "/tinymce_assets/" for 82.84.80.128 at 2015-09-28 16:32:07 -0400
I, [2015-09-28T16:32:07.722280 #6136]  INFO -- : Started GET "/at/tinymce_assets/" for 82.84.80.128 at 2015-09-28 16:32:07 -0400
F, [2015-09-28T16:32:07.726369 #6136] FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/at/tinymce_assets"):
  actionpack (4.1.12) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.1.12) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.1.12) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.1.12) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.1.12) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.1.12) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.1.12) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.1.12) lib/rails/rack/logger.rb:20:in `call'
  request_store (1.2.0) lib/request_store/middleware.rb:8:in `call'
  actionpack (4.1.12) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.5) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.5) lib/rack/runtime.rb:17:in `call'
  activesupport (4.1.12) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
  rack (1.5.5) lib/rack/sendfile.rb:112:in `call'
  railties (4.1.12) lib/rails/engine.rb:514:in `call'
  railties (4.1.12) lib/rails/application.rb:144:in `call'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb:94:in `process_request'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:149:in `accept_and_process_next_request'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:110:in `main_loop'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler.rb:415:in `block (3 levels) in start_threads'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/utils.rb:111:in `block in create_thread_and_abort_on_exception'

If I add uploadimage_form_url: "/tinymce_assets" (again the post is on top) the same happens, except that it is now looking for the localized version:

ActionController::RoutingError (No route matches [GET] "/at/tinymce_assets"):
  actionpack (4.1.12) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.1.12) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.1.12) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.1.12) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.1.12) lib/active_support/tagged_logging.rb:68:in `block in tagged'
  activesupport (4.1.12) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.1.12) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.1.12) lib/rails/rack/logger.rb:20:in `call'
  request_store (1.2.0) lib/request_store/middleware.rb:8:in `call'
  actionpack (4.1.12) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.5) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.5) lib/rack/runtime.rb:17:in `call'
  activesupport (4.1.12) lib/active_support/cache/strategy/local_cache_middleware.rb:26:in `call'
  rack (1.5.5) lib/rack/sendfile.rb:112:in `call'
  railties (4.1.12) lib/rails/engine.rb:514:in `call'
  railties (4.1.12) lib/rails/application.rb:144:in `call'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/rack/thread_handler_extension.rb:94:in `process_request'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:149:in `accept_and_process_next_request'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler/thread_handler.rb:110:in `main_loop'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/request_handler.rb:415:in `block (3 levels) in start_threads'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/utils.rb:111:in `block in create_thread_and_abort_on_exception'

The entire setup works on my local environment:

tinymce-rails (4.2.5)
tinymce-rails-imageupload (4.0.16.beta, 3.5.6.4)

OSX Yosemite 10.10.5
Rails 4.1.12
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]

The setup used to work, but not anylonger (after no apparent change - whilst I am currently also going through my GIT commits):

tinymce-rails (4.2.5)
tinymce-rails-imageupload (4.0.16.beta, 3.5.8.3)
Ubuntu 14.04.2 LTS
Rails 4.1.12
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-linux]

Here a full list of gems used in this application:

*** LOCAL GEMS ***

actionmailer (4.1.12)
actionpack (4.1.12)
actionview (4.1.12)
activemodel (4.1.12)
activerecord (4.1.12)
activesupport (4.1.12)
addressable (2.3.8)
arel (5.0.1.20140414130214)
bcrypt (3.1.10)
better_errors (2.1.1)
bigdecimal (1.2.4)
binding_of_caller (0.7.2)
bootstrap-datepicker-rails (1.4.0)
bootstrap-sass (3.1.1.1)
bootstrap-timepicker-rails (0.1.3)
bootstrap_form (2.3.0)
breadcrumbs_on_rails (2.3.1)
browser (1.0.1)
builder (3.2.2)
bundler (1.10.5)
cancancan (1.12.0)
capistrano (3.1.0)
capybara (2.5.0)
carrierwave (0.10.0)
chart-js-rails (0.0.8)
childprocess (0.5.6)
chronic (0.10.2)
climate_control (0.0.3)
cocaine (0.5.7)
cocoon (1.2.6)
coderay (1.1.0)
coffee-rails (4.0.1)
coffee-script (2.4.1)
coffee-script-source (1.9.1.1)
colorize (0.7.7)
config (1.0.0)
css_splitter (0.4.2)
database_cleaner (1.5.0)
debug_inspector (0.0.2)
deep_merge (1.0.1)
dependent-fields-rails (0.4.2)
devise (3.5.2)
diff-lcs (1.2.5)
domain_name (0.5.24)
dragonfly (0.9.15)
dropzonejs-rails (0.7.1)
erubis (2.7.0)
escape_utils (1.1.0)
execjs (2.6.0)
factory_girl (4.2.0)
factory_girl_rails (4.2.1)
faker (1.5.0)
fast_blank (1.0.0)
fast_stack (0.1.0)
ffi (1.9.10)
flamegraph (0.1.0)
font-awesome-rails (4.2.0.0)
friendly_id (5.1.0)
friendly_id-globalize (1.0.0.alpha2)
gaffe (1.0.2)
geocoder (1.2.10)
gli (2.13.2)
globalize (4.0.3)
globalize-accessors (0.1.5)
gmaps4rails (2.1.2)
gritter (1.1.0)
haml (4.0.7)
haml-rails (0.9.0)
html2haml (2.0.0)
http-cookie (1.0.2)
i18n (0.6.11)
io-console (0.4.3)
jbuilder (1.5.3)
jquery-fileupload-rails (0.4.5)
jquery-rails (3.1.4)
jquery-ui-rails (5.0.5)
json (1.8.3, 1.8.1)
launchy (2.4.3)
lazyload-rails (0.3.1)
libv8 (3.16.14.11 x86_64-linux)
localeapp (0.9.3)
mail (2.6.3)
mail_form (1.5.1)
maxminddb (0.1.8)
mime-types (2.6.1)
mimemagic (0.3.0)
mini_portile (0.6.2)
minitest (5.8.0, 4.7.5)
mobileesp_converted (0.2.3)
mobvious (0.3.2)
mobvious-rails (0.1.2)
modernizr-rails (2.7.1)
multi_json (1.11.2)
mysql2 (0.3.20)
net-scp (1.2.1)
net-ssh (2.9.2)
netrc (0.10.3)
nokogiri (1.6.6.2)
orm_adapter (0.5.0)
paper_trail (4.0.0)
paperclip (4.3.0)
papercrop (0.2.0)
pr_geohash (1.0.0)
psych (2.0.5)
pundit (1.0.1)
quiet_assets (1.1.0)
rack (1.5.5)
rack-cache (1.2)
rack-mini-profiler (0.9.7)
rack-test (0.6.3)
rails (4.1.12)
rails4-autocomplete (1.1.1)
rails_layout (1.0.26)
railties (4.1.12)
rake (10.4.2, 10.1.0)
rake-compiler (0.9.5)
rdoc (4.2.0, 4.1.0)
recaptcha (0.4.0)
redis (3.2.1)
redis-actionpack (4.0.1)
redis-activesupport (4.1.1)
redis-namespace (1.5.2)
redis-rack (1.5.0)
redis-rack-cache (1.2.2)
redis-rails (4.0.0)
redis-store (1.1.6)
ref (2.0.0)
request_store (1.2.0)
responders (1.1.2)
rest-client (1.8.0)
role_model (0.8.2)
route_downcaser (1.1.4)
route_translator (4.0.0)
rsolr (1.0.12)
rspec-core (2.14.8)
rspec-expectations (2.14.5)
rspec-mocks (2.14.6)
rspec-rails (2.14.2)
ruby_parser (3.7.1)
rubyzip (1.1.7)
sass (3.4.18)
sass-rails (5.0.4)
sdoc (0.4.1)
seed_dump (3.2.2)
selenium-webdriver (2.47.1)
settingslogic (2.0.9)
sexp_processor (4.6.0)
sitemap_generator (5.1.0)
sprockets (3.3.4)
sprockets-rails (2.3.3)
sshkit (1.7.1)
sunspot (2.2.0)
sunspot_rails (2.2.0)
sunspot_solr (2.2.0)
test-unit (2.1.6.0)
therubyracer (0.12.1)
thor (0.19.1)
thread_safe (0.3.5)
tilt (2.0.1)
tinymce-rails (4.2.5)
tinymce-rails-imageupload (4.0.16.beta, 3.5.8.3)
tzinfo (1.2.2)
uglifier (2.7.2)
underscore-rails (1.8.3)
unf (0.1.4)
unf_ext (0.0.7.1)
videojs_rails (4.12.14)
warden (1.2.3)
websocket (1.2.2)
whenever (0.9.4)
wiselinks (1.2.1)
xpath (2.0.0)
ya2yaml (0.31)

Hope this helps to shed light into the situation. :)

2

There are 2 best solutions below

5
PerfectlyNormal On

You should swap the last match '*path' line and the post '/tinymce_assets/' line. That will probably take care of it, or at least get you a bit further.

Routes in Rails match from the top, so match '*path' matches a POST to /tinymce_assets, sees it doesn't have a locale added, and does the redirect, via GET. Your application never reaches the line for post '/tinymce_assets'.

0
Georg Keferböck On

Solution to the problem:

As I am rewriting and existing site and must keep the URL standards I have to keep the trailing slashes (which I do in Rails).

In my nginx site configuration I rewrote the URL's with a trailing slash, which for some reason turned into a two day masacre of narrowing down the issue.

Removing the trailing slash in the URL rewrite in nginx configuration file solved the issue.

No jQuery sends POST requests again instead of GET requests !

Here for nginx (froala & tiny_mce and whatever you may use):

#Rewrite all URLs with missing slash and no period
    location / {
            rewrite ^([^.]*[^/])$ $1/ permanent;
    }
    #Keep your post url untouched
    location /froala_upload {
            rewrite $1 permanent;
    }

    location /tinymce_assets {
            rewrite $1 permanent;
    }