繁体   English   中英

Rails JQuery发送GET而不是POST请求

[英]Rails JQuery sending GET instead of POST request

我一直困扰着Rails问题几天,却找不到解决方案。 我的代码曾经可以工作,但是对javascript进行了一些重大更改(必填),因此不再起作用。

我的用户可以参加活动并退出活动。 这需要用户单击按钮,然后发送发布请求,但是由于某种原因,该请求被作为Get请求处理,并且失败,因为没有用于get请求的路由(需要发布)。

视图:

    <% if @competition.users.exclude?(@user)  %>
      <%= link_to 'Attend Competition', attend_competition_path(@competition.id), :method => :post %>
    <% else %>
      <%= link_to 'Withdraw', withdraw_competition_path(@competition.id), :method => :post %>

application.js

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

application.html.erb

<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= csrf_meta_tags %>

routes.rb

  resources   :competitions do
    post 'attend', on: :member
  end
  resources   :competitions do
    member do 
      post 'withdraw'
    end
  end

控制器:

def attend
@competition = Competition.find(params[:id])
if @competition.users.include?(current_user)
  flash[:error] = "You're already attending this competition."
elsif current_user.daily == []
  flash[:error] = "You must have a working device to compete."
else
  current_user.competitions << @competition
  flash[:success] = "Attending competition!"
end
redirect_to @competition
end


def withdraw
p "WITHDRAWING"
@competition    = Competition.find(params[:id])
p @competition
attendee = Attendee.find_by_user_id_and_competition_id(current_user.id, @competition.id)
if attendee.blank?
  flash[:error] = "No current attendees"
else
  attendee.delete
  flash[:success] = 'You are no longer attending this competition.'
end
p attendee
redirect_to @competition
end

实际错误:

ActionController::RoutingError (No route matches [GET] "/competitions/9/withdraw"):

谢谢

**额外**

完成show.view

<p id="notice"><%= notice %></p>
<p>
  <%= @competition.title %>
</p>
<p>
  <b>Length:</b>
  <%= @competition.length %>
</p>
  <b>Start:</b>
  <%= @competition.start.strftime("%d %m %Y") %>
</p>
  <b>End:</b>
  <%= @competition.end.strftime("%d %m %Y") %>
</p>
<p><strong>Attendees: </strong>
    <% if @competition.users.exclude?(@user)  %>
      <%= link_to 'Attend Competition', attend_competition_path(@competition.id), :method => :post %>
    <% else %>
      <%= link_to 'Withdraw', withdraw_competition_path(@competition.id), :method => :post %>
    <% end %>
</p>
<% a = 1 %>
<% for attendee in @competition.users %>
  <p2><strong><%= a %> </strong><%= link_to attendee.name, attendee %></p2>
  <% if attendee.daily != [] %>
   <p><%= attendee.daily.first(7).sum %></p>
  <% end %>
  <% a = a + 1 %>
<% end %>
</br>


<%= link_to 'Edit', edit_competition_path(@competition) %> |
<%= link_to 'Back', competitions_path %>

Rails的HTML输出

<a href="/competitions/4/withdraw" data-method="post" rel="nofollow">Withdraw</a>

**摩尔**

从日志中完成错误

ActionController::RoutingError (No route matches [GET] "/competitions/6/withdraw"):
  actionpack (3.2.3) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call'
  railties (3.2.3) lib/rails/rack/logger.rb:26:in `call_app'
  railties (3.2.3) lib/rails/rack/logger.rb:16:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/request_id.rb:22:in `call'
  rack (1.4.5) lib/rack/methodoverride.rb:21:in `call'
  rack (1.4.5) lib/rack/runtime.rb:17:in `call'
  activesupport (3.2.3) lib/active_support/cache/strategy/local_cache.rb:72:in `call'
  rack (1.4.5) lib/rack/lock.rb:15:in `call'
  actionpack (3.2.3) lib/action_dispatch/middleware/static.rb:62:in `call'
  railties (3.2.3) lib/rails/engine.rb:479:in `call'
  railties (3.2.3) lib/rails/application.rb:220:in `call'
  rack (1.4.5) lib/rack/content_length.rb:14:in `call'
  railties (3.2.3) lib/rails/rack/log_tailer.rb:14:in `call'
  rack (1.4.5) lib/rack/handler/webrick.rb:59:in `service'
  /Users/Marcus/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service'
  /Users/Marcus/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run'
  /Users/Marcus/.rvm/rubies/ruby-1.9.3-p448/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread'


  Rendered /Users/Marcus/.rvm/gems/ruby-1.9.3-p448@rails3tutorial2ndEd/gems/actionpack-3.2.3/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (0.5ms)

来自浏览器的HTML:

<a href="/competitions/3/withdraw" data-method="post" rel="nofollow">Withdraw</a>

整页[可能很长]:

<html><head>
<title>BOTB</title>
<link data-turbolinks-track="true" href="/assets/application.css" media="all" rel="stylesheet" type="text/css">
<script data-turbolinks-track="true" src="/assets/application.js" type="text/javascript">    </script><style type="text/css"></style>
<meta content="authenticity_token" name="csrf-param">
<meta content="Cl7ar8gwVcRsJzrKjp92KB6p6PihvVu0jAwngi18dWU=" name="csrf-token">
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->

  <style id="clearly_highlighting_css" type="text/css">/* selection */ html.clearly_highlighting_enabled ::-moz-selection { background: rgba(246, 238, 150, 0.99); } html.clearly_highlighting_enabled ::selection { background: rgba(246, 238, 150, 0.99); } /* cursor */ html.clearly_highlighting_enabled {    /* cursor and hot-spot position -- requires a default cursor, after the URL one */    cursor: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--cursor.png") 14 16, text; } /* highlight tag */ em.clearly_highlight_element {    font-style: inherit !important; font-weight: inherit !important;    background-image: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--yellow.png");    background-repeat: repeat-x; background-position: top left; background-size: 100% 100%; } /* the delete-buttons are positioned relative to this */ em.clearly_highlight_element.clearly_highlight_first { position: relative; } /* delete buttons */ em.clearly_highlight_element a.clearly_highlight_delete_element {    display: none; cursor: pointer;    padding: 0; margin: 0; line-height: 0;    position: absolute; width: 34px; height: 34px; left: -17px; top: -17px;    background-image: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--delete-sprite.png"); background-repeat: no-repeat; background-position: 0px 0px; } em.clearly_highlight_element a.clearly_highlight_delete_element:hover { background-position: -34px 0px; } /* retina */ @media (min--moz-device-pixel-ratio: 2), (-webkit-min-device-pixel-ratio: 2), (min-device-pixel-ratio: 2) {    em.clearly_highlight_element { background-image: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--yellow@2x.png"); }    em.clearly_highlight_element a.clearly_highlight_delete_element { background-image: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/highlight--delete-sprite@2x.png"); background-size: 68px 34px; } } </style><style>[touch-action="none"]{ -ms-touch-action: none; touch-action: none; }[touch-action="pan-x"]{ -ms-touch-action: pan-x; touch-action: pan-x; }[touch-action="pan-y"]{ -ms-touch-action: pan-y; touch-action: pan-y; }[touch-action="scroll"],[touch-action="pan-x pan-y"],[touch-action="pan-y pan-x"]{ -ms-touch-action: pan-x pan-y; touch-action: pan-x pan-y; }</style></head>
  <body style="">
    <header class="navbar navbar-fixed-top navbar-inverse">
  <div class="navbar-inner">
    <div class="container">
      <a href="/" id="logo">Battle Of The Bands</a>
      <nav>
        <ul class="nav pull-right navbar-nav " id="menu">
          <li><a href="/">Home</a></li>
          <li><a href="/competitions">Competition</a></li>
            <li><a href="/users">Users</a></li>
            <li id="fat-menu" class="dropdown">
              <a href="#" class="dropdown-toggle" data-toggle="dropdown">
                Account <b class="caret"></b>
              </a>
              <ul class="dropdown-menu">
                <li><a href="/users/1">Profile</a></li>
                <li><a href="/devices">Connect Device</a></li>
                <li><a href="/competitions/new">Create Competition</a></li>
                <li><a href="/users/1/edit">Settings</a></li>
                <li class="divider"></li>
                <li>
                  <a href="/signout" data-method="delete" rel="nofollow">Sign out</a>
                </li>
              </ul>
            </li>
        </ul>
      </nav>
    </div>
  </div>
</header>
    <div class="container">
      <p id="notice"></p>

<p>
  Tester March 8
</p>

<p>
  <b>Length:</b>
  5
</p>
  <b>Start:</b>
  03 03 2014
    <p></p>
  <b>End:</b>
  03 03 2014
<p></p>
<p><strong>Attendees: </strong>
      <a href="/competitions/3/withdraw" data-method="post" rel="nofollow">Withdraw</a>
</p>
  <p2><strong>1 </strong><a href="/users/1">Marcus Smith</a></p2>
   <p>49774</p>
<br>


<a href="/competitions/3/edit">Edit</a> |
<a href="/competitions">Back</a>

      <footer class="footer">
  <small>
    by <a href="http://www.twitter.com/_mhsmith_"> Marcus Smith</a>
  </small>
  <nav>
    <ul>
      <li><a href="/about">About</a></li>
    </ul>
  </nav>
</footer>
      <!-- <pre class='debug_dump'>--- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
action: show
controller: competitions
id: '3'
    </pre> -->
    </div>

</body></html>

我怀疑这是因为您没有包含jquery_ujs.js。

// application.js
//
//= require jquery
//= require jquery_ujs

在application.js清单中,您应该包含jquery_ujs-由于标签中的data-method字段,因此不会将GET请求转换为POST的简洁的JavaScript代码。

如果确实包含jquery_ujs.js,那么sevenseacat关于javascript错误的评论可能就是它-如果在执行jquery_ujs.js之前引发了任何javascript错误,它将无法解释您的链接。

我不知道有人问过这个问题,因为自问了问题以来已经过去了很多时间,但是我遇到了同样的问题,所以如果有人在寻找答案,而jquery-ujs不是问题,那么这就是最终的结果为我解决了它-仔细检查您的代码,并确保您没有

$(document).unbind('click') ...

您代码中的任何地方。 这将导致所需的JavaScript Rails用于将GET请求转换为POST或DELETE请求而无法运行。 希望能帮助解决这个困扰我很长时间的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM