2017-02-06 4 views
0

У меня есть следующий кодRails PATCH метод вместо POST

<%= form_for @campaign, url: brands_campaign_path(@campaign), method: :patch, :html => {:multipart => true, :class => 'form-horizontal'} do |f| %> 

, который генерирует следующую

<form class="form-horizontal" id="edit_campaign_25" enctype="multipart/form-data" action="/campaigns/testing" accept-charset="UTF-8" method="post"> 
<input name="utf8" type="hidden" value="&#x2713;" /> 
<input type="hidden" name="_method" value="patch" /> 
<input type="hidden" name="authenticity_token" value="Ybl3G26TZumVbbCew2EmlVxq4Dv2JZx5PAq1Q7nup3vp0GdkT72oIlV==" /> 

Но на стороне сервера я получаю POST запрос. Я проверил, что javascripts jquery_ujs.js загружается в браузер.

рейк маршруты

brands_campaigns GET /campaigns(.:format)           brands/campaigns#index {:subdomain=>"brands"} 
                 POST /campaigns(.:format)           brands/campaigns#create {:subdomain=>"brands"} 
            new_brands_campaign GET /campaigns/new(.:format)          brands/campaigns#new {:subdomain=>"brands"} 
           edit_brands_campaign GET /campaigns/:id/edit(.:format)        brands/campaigns#edit {:subdomain=>"brands"} 
             brands_campaign GET /campaigns/:id(.:format)          brands/campaigns#show {:subdomain=>"brands"} 
                 PATCH /campaigns/:id(.:format)          brands/campaigns#update {:subdomain=>"brands"} 
                 PUT /campaigns/:id(.:format)          brands/campaigns#update {:subdomain=>"brands"} 
                 DELETE /campaigns/:id(.:format)          brands/campaigns#destroy {:subdomain=>"brands"} 
           brands_campaigns_posts GET /campaigns/:id/posts(.:format)        brands/campaigns#posts {:subdomain=>"brands"} 
          brands_campaigns_details GET /campaigns/:id/details(.:format)        brands/campaigns#details {:subdomain=>"brands"} 
         brands_campaigns_influencers GET /campaigns/:id/influencers(.:format)       brands/campaigns#influencers {:subdomain=>"brands"} 
       brands_campaigns_submit_for_approval GET /campaigns/:id/submit_for_approval(.:format)     brands/campaigns#submit_for_approval {:subdomain=>"brands"} 
        brands_campaigns_pending_to_draft GET /campaigns/:id/pending_to_draft(.:format)     brands/campaigns#pending_to_draft {:subdomain=>"brands"} 
           brands_campaigns_cancel GET /campaigns/:id/cancel(.:format)        brands/campaigns#cancel {:subdomain=>"brands"} 
         brands_campaigns_add_credits GET /campaigns/:id/add_credits(.:format)       brands/campaigns#add_credits {:subdomain=>"brands"} 

журналы

ActionController::RoutingError (No route matches [POST] "/campaigns/testing/edit"): actionpack (4.2.5.2) 
lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call' rollbar (2.14.0) 
lib/rollbar/middleware/rails/show_exceptions.rb:22:in `call_with_rollbar' web-console (2.3.0) 
lib/web_console/middleware.rb:20:in `block in call' web-console (2.3.0) 
lib/web_console/middleware.rb:18:in `catch' web-console (2.3.0) 
lib/web_console/middleware.rb:18:in `call' actionpack (4.2.5.2) 
lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' railties (4.2.5.2) 
lib/rails/rack/logger.rb:38:in `call_app' railties (4.2.5.2) 
lib/rails/rack/logger.rb:20:in `block in call' activesupport (4.2.5.2) 
lib/active_support/tagged_logging.rb:68:in `block in tagged' activesupport (4.2.5.2) 
lib/active_support/tagged_logging.rb:26:in `tagged' activesupport (4.2.5.2) 
lib/active_support/tagged_logging.rb:68:in `tagged' railties (4.2.5.2) 
lib/rails/rack/logger.rb:20:in `call' actionpack (4.2.5.2) 
lib/action_dispatch/middleware/request_id.rb:21:in `call' rack (1.6.5) 
lib/rack/methodoverride.rb:22:in `call' rack (1.6.5) 
lib/rack/runtime.rb:18:in `call' activesupport (4.2.5.2) 
lib/active_support/cache/strategy/local_cache_middleware.rb:28:in `call' rack (1.6.5) 
lib/rack/lock.rb:17:in `call' actionpack (4.2.5.2) 
lib/action_dispatch/middleware/static.rb:116:in `call' rack (1.6.5) 
lib/rack/sendfile.rb:113:in `call' railties (4.2.5.2) 
lib/rails/engine.rb:518:in `call' railties (4.2.5.2) 
lib/rails/application.rb:165:in `call' rack (1.6.5) 
lib/rack/tempfile_reaper.rb:15:in `call' rack (1.6.5) 
lib/rack/lint.rb:49:in `_call' rack (1.6.5) 
lib/rack/lint.rb:37:in `call' rack (1.6.5) 
lib/rack/showexceptions.rb:24:in `call' rack (1.6.5) 
lib/rack/commonlogger.rb:33:in `call' sinatra (1.4.7) 
lib/sinatra/base.rb:219:in `call' rack (1.6.5) 
lib/rack/chunked.rb:54:in `call' rack (1.6.5) 
lib/rack/content_length.rb:15:in `call' unicorn (5.2.0) 
lib/unicorn/http_server.rb:562:in `process_client' unicorn (5.2.0) 
lib/unicorn/http_server.rb:658:in `worker_loop' unicorn (5.2.0) 
lib/unicorn/http_server.rb:508:in `spawn_missing_workers' unicorn (5.2.0) 
lib/unicorn/http_server.rb:132:in `start' unicorn (5.2.0) 
bin/unicorn:126:in `<top (required)>' 
/usr/local/rvm/gems/ruby-2.3.1/bin/unicorn:23:in `load' 
/usr/local/rvm/gems/ruby-2.3.1/bin/unicorn:23:in `<main>' 
/usr/local/rvm/gems/[email protected]/bin/ruby_executable_hooks:15:in `eval' 
/usr/local/rvm/gems/[email protected]/bin/ruby_executable_hooks:15:in `<main>' 

Что Маршрут он должен ударить, как это делает на Firefox

Started PATCH "/campaigns/testing" for 106.51.30.182 at 2017-02-06 11:18:02 -0500 
+0

Вы можете разместить вывод для './bin/rake маршрутов | grep -i campaign'? – Swanand

+0

@Swanand обновили его :) –

+0

Что вы подразумеваете под «Я получаю запрос POST»? Как указывает @Alfie ниже, это именно то, что должно произойти. Вы имеете в виду, что он отправляет маршрут 'POST/campaign (.: Format)' вместо маршрута 'PATCH/campaign /: id (.: Format)', поэтому вы считаете, что он игнорирует скрытое значение '_method'? –

ответ

3

из документации:

Метод, используемый при отправке формы, как правило, либо «получить» или «пост». Если используются «patch», «put», «delete» или другой глагол, для моделирования глагола над сообщением добавляется скрытый ввод с именем _method.

Источник: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html

, как показано на фрагменте кода в вашем вопросе <input type="hidden" name="_method" value="patch" /> имитирует patch метод над post

+0

Как уже упоминалось, он не работает так, как должен в Chrome и Safari. –

Смежные вопросы