ruby-on-rails-3 - Rails 奇数 :delete behaviour with twitter-bootstrap-rails

标签 ruby-on-rails-3 twitter-bootstrap

我遇到了一个奇怪的问题:链接的删除方法行为。我配置了一个设计sign_out路由,该路由在下拉框中链接。单击该链接时,会导致路由错误(没有路由匹配 [GET]“/users/sign_out”)。

奇怪的是,当我将该链接复制到导航栏中的另一个位置时,它工作得很好。

RoR 导航栏代码是:

<div class="container nav-collapse">
<ul class="nav">
  <li class="active">
    <%= link_to t('activeview.navigation.home'), home_index_path %>
  </li>
  <li>
    <%= link_to t('activeview.navigation.sign_in'), new_user_session_path %>
  </li>
  <li>
    <%= link_to t('activeview.navigation.sign_up'), new_user_registration_path %>
  </li>
  <li><%= link_to t('activeview.navigation.sign_out'), destroy_user_session_path, :method => :delete %></li>
  <li class="dropdown">
    <% if user_signed_in? %>
      <%= link_to (current_user.email + ' <span class="caret"></span>').html_safe, '#', {
        :class => 'dropdown-toggle',
        'data-toggle' => 'dropdown' } %>
      <ul class="dropdown-menu">
        <li><%= link_to t('activeview.navigation.settings'), edit_user_registration_path(current_user) %></li>
        <li class="divider"></li>
        <li><%= link_to t('activeview.navigation.sign_out'), destroy_user_session_path, :method => :delete %></li>
    <% else %>
      <%= link_to (t('activeview.navigation.not_connected') + ' <span class="caret"></span>').html_safe, '#', {
        :class => 'dropdown-toggle',
        'data-toggle' => 'dropdown' } %>
    <% end %>
    </ul>
  </li>
</ul>
</div><!--/.nav-collapse -->

我的 application.js 如下所示:

//= require jquery
//= require jquery_ujs
//= require twitter/bootstrap
//= require_tree .

下面是我的导航栏。情况是sign_out_1工作正常,但sign_out_2使用GET方法而不是DELETE。

<div class="navbar navbar-fixed-top">
  <div class="navbar-inner">
    <div class="container">
    <a class="btn btn-navbar" data-target=".nav-collapse" data-toggle="collapse">
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    <span class="icon-bar"></span>
    </a>
    <a class="brand" href="#">Brand</a>
    <div class="container nav-collapse">
    <ul class="nav">
      <li><a href="/users/sign_out" data-method="delete" rel="nofollow">sign_out_1</a></li>
      <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown"><a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="660b070f0a260e09120b070f0a4805090b" rel="noreferrer noopener nofollow">[email protected]</a> <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="/users/edit.2">Configuración</a></li>
            <li class="divider"></li>
            <li><a href="/users/sign_out" data-method="delete" rel="nofollow">sign_out_2</a></li>
        </ul>
      </li>
    </ul>
    </div><!--/.nav-collapse -->
    </div>
  </div>
</div>

我的销毁路线是:

destroy_user_session     DELETE /users/sign_out(.:format)    devise/sessions#destroy

最后,.js 加载部分为:

<script src="/assets/jquery.js?body=1" type="text/javascript"></script>
<script src="/assets/jquery_ujs.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-transition.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-alert.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-modal.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-dropdown.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-scrollspy.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-tab.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-tooltip.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-popover.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-button.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-collapse.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-carousel.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-typeahead.js?body=1" type="text/javascript"></script>
<script src="/assets/twitter/bootstrap/bootstrap-affix.js?body=1" type="text/javascript"></script>

最佳答案

一个快速的解决方法是在 ./config/initializers/devise.rb 中将 sign_out 更改为使用 HTTP GET 而不是 HTTP DELETE

# The default HTTP method used to sign out a resource. Default is :delete.
config.sign_out_via = :get

然后更改对sign_out的调用以发送GET:

<%= link_to t('activeview.navigation.sign_out'), destroy_user_session_path, :method => :get %></li>

关于ruby-on-rails-3 - Rails 奇数 :delete behaviour with twitter-bootstrap-rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12096738/

相关文章:

ruby-on-rails - Post.create 方法参数数量不正确(3 为 2)

twitter-bootstrap - Twitter Bootstrap 从底部对齐下拉菜单

javascript - bootstrap 只打开你点击的折叠

ruby-on-rails - 如何将 CanCanCan 与枚举字段一起使用?

ruby-on-rails - 类型错误 : can't convert Post into Array

ruby-on-rails - Rails 路径中出现错误 "jquery.js isn' t ....”

ruby-on-rails-3 - TDD:Rspec Ruby MongoDB/Ruby Mongo 驱动程序

html - 如何在中间输入表单

html - 如何防止 float 标签与输入混合?

javascript - Bootstrap JavaScript 滚动问题