2012-12-29 119 views
0

在Ruby on Rails應用程序中,有一段時間裏有一個讓我困惑的問題。我在3個不同的環境中測試了相同的工作流程,並且沒有一個能夠讓「銷燬」鏈接正常工作!爲什麼我的RoR銷燬鏈接不起作用?

使用該設置:

  • RVM 1.17.4
  • 紅寶石1.9.3p327
  • 滑軌3.2.9

然後,執行從字面上看,這些命令:

$ rails new foo 
$ cd foo/ 
$ rails g scaffold bar title:string 
$ rake db:migrate 

它生成這個控制器:

# DELETE /bars/1 
    # DELETE /bars/1.json 
    def destroy 
    @bar = Bar.find(params[:id]) 
    @bar.destroy 

    respond_to do |format| 
     format.html { redirect_to bars_url } 
     format.json { head :no_content } 
    end 
    end 

這是破壞行認爲:

<%= link_to 'Destroy', bar, method: :delete, data: { confirm: 'Are you sure?' } %> 

這是最後一頁代碼:

<a href="/bars/1" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a> 

在佈局我有這些:

<%= stylesheet_link_tag "application", :media => "all" %> 
    <%= javascript_include_tag "application" %> 
    <%= csrf_meta_tags %> 

而在application.js我有這些:

//= require jquery 
//= require jquery_ujs 
//= require_tree . 

這些都是在HTML輸出線:

<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/bars.js?body=1" type="text/javascript"></script> 
<script src="/assets/application.js?body=1" type="text/javascript"></script> 

這些路線:

bars GET /bars(.:format)   bars#index 
     POST /bars(.:format)   bars#create 
new_bar GET /bars/new(.:format)  bars#new 
edit_bar GET /bars/:id/edit(.:format) bars#edit 
    bar GET /bars/:id(.:format)  bars#show 
     PUT /bars/:id(.:format)  bars#update 
     DELETE /bars/:id(.:format)  bars#destroy 

任何人都得出了同樣的結果嗎?爲什麼它不起作用?

我在互聯網上找到的解決方法是建議JavaScript沒有正確加載,有時建議將操作從DELETE更改爲GET。有些人建議改變一個按鈕的鏈接。無論如何,這個確認從來沒有出現,而且在所有視圖中重寫所有的銷燬行爲真的很煩人。

+0

爲什麼你的link_to裏沒有@ infront的酒吧? – TomJ

+0

嗨,TomJ,這是因爲這是在索引頁面,所以它是在一個循環內。 「@ bar」實際上是所有條目的列表。 = D – Apollo

+0

你的控制檯日誌說什麼?應該看起來像這樣: 開始刪除「/ posts/2」爲127.0.0.1於2012-12-29 16:17:36 -0500 通過PostsController處理#銷燬爲HTML 參數:{「authenticity_token」=>「 Z7MWoO6XliYLHX4qUrnrnrS23QnTTxltq + sCmRhmZ9Y =「,」id「=>」2「} 後加載(0.2ms)選擇」posts「。* FROM」posts「WHERE」posts「。」id「=? LIMIT 1 [[「id」,「2」]] (0.1ms)begin transaction SQL(17.6ms)DELETE FROM「posts」WHERE「posts」。「id」=? [[「id」,2]] (36.3ms)commit transaction 重定向到http:// localhost:3000/posts 已完成302在61ms中找到(ActiveRecord:54.3ms) – TomJ

回答

0

如果啓動Javascript並確定該破壞行動都必須工作,但鏈接不會發送正確的HTTP_METHOD = DELETE和路由的設置是正確的,然後嘗試改變DOCTYPE

<!DOCTYPE html> 
1

鑑於HTML,應該沒有問題。因此,這可能是客戶端問題,而不是服務器端問題。

至於你說的......

我在網上查到所提出的建議的JavaScript加載不正確的解決辦法...

  1. 你可能有一個瀏覽器不支持JavaScript,或者您禁用了JavaScript。

    您測試過哪些瀏覽器?試試Firefox,並在選項窗口中確認內容標籤有啓用javascript檢查。

  2. 或者,在您的瀏覽器中轉到/assets/jquery.js?body=1/assets/jquery_ujs.js?body=1以確保JavaScript框架文件在那裏。如果不是,則需要將這些添加到您的資產目錄中,如果您在生產環境中運行,則需要運行rake assets:precompile