javascript依赖项导致link_to方法:: destroy发出GET请求

时间:2014-11-26 02:31:26

标签: javascript ruby-on-rails ruby-on-rails-4 routes navbar

更新(2015年2月26日):

jPushMenu.js有一个正在进行e.preventDefault()调用的处理程序。如果我删除了这一行事件处理程序,我就会停止看到不良行为。 jPushMenu现在还有一个新版本的代码,不使用此e.preventDefault()调用,这也解决了我的问题。对于遇到类似问题的人来说,问题如下,但可能不是他们的新版本。

问题:

我在链接中遇到问题,我在method: :delete帮助器中指定了link_to,如下所示:

<li>
  <%= link_to raw('<span class="glyphicon glyphicon-off"></span>&nbsp;&nbsp;&nbsp;Sign out'), 
              signout_path, 
              method: :delete %>
</li>

即使我像上面那样指定method: :delete,并且呈现的HTML确实包含data-method="delete"属性,点击该链接也会发出GET请求。

直到我将以下文件添加到app/assets/javascripts/目录:jPushMenu.js之前,这一直不是问题。如下所示,我通过带有行//= require_tree .的应用程序javascript清单文件包含此文件。基本上,一旦我添加了一个不同的,移动友好的bootstrap风格的导航栏,我的注销链接就会崩溃。

我真的想知道如何使推送菜单导航栏工作,同时也允许我的注销链接像以前一样工作,但我不知道我在这里缺少什么。我害怕的一件事是,我有这么多的javascript文件,有些东西可能会踩到另一个,也许我最终加载它们的顺序?有没有其他人有任何想法为什么会出现这种情况?

关于其他类似的StackOverflow问题:

您会注意到我的链接位于<li>...</li>标记中。这是因为此链接显示在导航标题对象的引导样式下拉列表中。其他StackOverflow问题(我实际上可以找到的大多数问题)表明使用button_to帮助程序而不是link_to帮助程序可以解决问题。它绝对有效。但是现在我的下拉列表中有一个奇怪的按钮,并且所有引导样式都忽略了下拉列表的这一部分,因为它正在寻找<a>标记,而不是<button style="button">标记。

更直接的问题:在哪里调试这个好地方?如果Rails处理data-method属性并使用javascript发出DELETE请求,那么应该将应用程序代码的哪一部分放入断点?

(以下是您可能想要或不想看的文件和输出......)

的application.js:

//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require autocomplete-rails
//= require turbolinks
//= require bootstrap-sprockets
//= require bootstrap
//= require moment
//= require bootstrap-datetimepicker
//= require bootstrap-select
//= require bootstrap-tokenfield
//= require underscore
//= require gmaps/google
//= require fullcalendar
//= require fullcalendar/gcal
//= require_tree .
...

的Gemfile:

source 'https://rubygems.org'
ruby '2.1.2'

gem 'rails'
gem 'bootstrap-sass'
gem 'sass-rails', '~> 4.0.0'
gem 'autoprefixer-rails'
gem 'bootstrap_form'
gem 'bcrypt-ruby'
gem 'faker', '1.1.2'
gem 'will_paginate'
gem 'bootstrap-will_paginate'
gem 'state_machine'
gem 'twitter_cldr'
gem 'pg'

gem 'figaro'
gem 'jquery-turbolinks'

gem 'uglifier'
gem 'coffee-rails'
gem 'jquery-rails'
gem 'jquery-ui-rails'
gem 'turbolinks'
gem 'jbuilder'
gem 'mail_form'
gem 'ransack'
gem 'momentjs-rails'
gem 'bootstrap3-datetimepicker-rails'
gem 'date_validator'
gem 'gmaps4rails'
gem 'geocoder'
gem 'bootstrap-select-rails'
gem 'fullcalendar-rails'
gem 'wepay'
gem 'omnicontacts', '~> 0.3.5', git: 'git://github.com/Diego81/omnicontacts.git'
gem 'rails4-autocomplete'
gem 'paperclip'
gem 'aws-s3'
gem 'aws-sdk'
gem 'mail'

gem 'mailboxer'

gem 'bootstrap_tokenfield_rails'

group :development, :test do
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'rspec-rails', '2.14.0'
  gem 'guard-rspec', '2.5.0'
  gem 'meta_request'
end

group :test do
  gem 'selenium-webdriver', '2.35.1'
  gem 'capybara', '2.1.0'
  gem 'factory_girl_rails', '4.2.1'
end

group :doc do
  gem 'sdoc', '0.3.20', require: false
end

group :production do
  gem 'rails_12factor'
end

的routes.rb

...
match '/signout', to: 'sessions#destroy', via: 'delete'
...

rake routes

的输出
...
sessions     POST    /sessions(.:format)      sessions#create
new_session  GET     /sessions/new(.:format)  sessions#new
session      DELETE  /sessions/:id(.:format)  sessions#destroy
...

1 个答案:

答案 0 :(得分:0)

jPushMenu.js有一个正在进行e.preventDefault()调用的处理程序。如果我删除了这一行事件处理程序,我就会停止看到不良行为。 jPushMenu现在还有一个新版本的代码,不使用这个e.preventDefault()调用,这也解决了我的问题。对于遇到类似问题的人来说,问题如下,但可能不是他们的新版本。