2014-03-04 82 views
0

我一直被困在rails問題上幾天,一直沒能找到解決方案。我的代碼曾用於工作,但JavaScript有一些重大更改(必需),它不再有效。Rails JQuery發送GET而不是POST請求

我的用戶可以參加和退出事件。這需要用戶點擊一個按鈕然後發送一個發佈請求,但由於某種原因,請求被作爲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"): 

感謝

** ** EXTRA

完全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 %> 

HTMLØ從安輸出Rails的

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

** ** MOAR

從日誌完全錯誤的瀏覽器

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/[email protected]/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/[email protected]"); } em.clearly_highlight_element a.clearly_highlight_delete_element { background-image: url("chrome-extension://pioclpoplcdbaefihamjohnefbikjilc/clearly/images/[email protected]"); 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="https://stackoverflow.com/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="https://stackoverflow.com/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="https://stackoverflow.com/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> 
+1

您可以分享Withdraw鏈接的結果HTML嗎?如果Rails正在做它的事情,那將是一種形式。順便說一句(也許只是一個複製/粘貼的東西),你在視圖中沒有**結尾**。只是提到因爲一切都看起來不錯,所以我們必須尋找奇怪的東西。 – Troy

+0

添加了額外的信息。希望這有助於 – Marcus

+1

在頁面上獲得任何javascript錯誤? – sevenseacat

回答

0

我懷疑這是因爲你沒有包含jquery_ujs.js。

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

在你的application.js清單,你應該包括jquery_ujs - it't不顯眼的JavaScript代碼,將改變GET請求到一個職位,因爲您的代碼中data-method領域。

如果已jquery_ujs.js包括,男然後sevenseacat的關於JavaScript錯誤的話可能是它 - 如果你有屬於jquery_ujs.js被執行之前被提出任何JavaScript錯誤,就無法解釋你的鏈接。

+0

我在我的application.js文件中包含jquery_ujs。我只是在日誌中包含了整個錯誤,也許這可能會有所幫助。 – Marcus

0

我不知道是否有人會看到這個問題,因爲問了很多時間,但我遇到了同樣的問題,所以如果有人正在尋找答案,jquery-ujs不是問題,這裏就是終於解決了這對我 - 仔細檢查你的代碼,並確保你沒有有:

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

在你的代碼的任何地方。這會導致所需的JavaScript Rails用法將GET請求轉換爲POST或DELETE請求而不能運行。希望能夠幫助解決這個長期困擾我的問題。

相關問題