2012-12-27 72 views
0

我想在我的應用程序中執行一個針對destroy操作的AJAX調用,並且遵循指南Ajax in Rails 3.1 - A Roadmap的示例#3來執行此操作。我正在使用Rails 3.2.8。Fixing Rails錯誤「The action'show'找不到SafetyTestsController」

我得到的AJAX請求工作得很好,並且destroy行動被調用,就像我期望的那樣。 當用戶請求動作destroy的HTML頁面時,我想刪除該項目,然後將其重定向到另一個頁面。

問題是,當我插入代碼重定向時,HTML和AJAX請求都停止工作。當代碼出現時,AJAX請求返回500內部服務器錯誤,並且HTML請求返回「無法找到SafetyTestsController的操作'show'」。當兩行不在時,AJAX可以正常工作,HTML仍會返回相同的錯誤。

視圖(未呈現):

<%= link_to 'Delete', {controller: 'safety_tests', action: 'destroy', id: safety_test.id}, remote: true, method: :delete, confirm: 'Are you sure?', id: "delete_safety_test" %> 

視圖(渲染):

<a href="/safety_tests/14" data-confirm="Are you sure?" data-method="delete" data-remote="true" id="delete_safety_test" rel="nofollow">Delete</a> 

應用程序/控制器/ safety_tests_controller.rb

class SafetyTestsController < ApplicationController 
    respond_to :html, :js 
    ... 
    def destroy 
    test = SafetyTest.find(params[:id]) 
    student_id = test.student_id 
    test.destroy 

    respond_with(test) do |format| 
     format.js { render nothing: true } 
    end 

    #Two lines below should run for an HTML request but not a Javascript request. 
    #When uncommented, AJAX request returns 500 Internal Server Error 
    #flash[:notice] = 'Safety test deleted successfully.' 
    #redirect_to controller: 'students', action: 'show', id: student_id 
    end 

耙路線

new_user_session GET /users/sign_in(.:format)      devise/sessions#new 
       user_session POST /users/sign_in(.:format)      devise/sessions#create 
     destroy_user_session DELETE /users/sign_out(.:format)     devise/sessions#destroy 
         root  /           dashboard#home 
        students GET /students(.:format)       students#index 
          POST /students(.:format)       students#create 
       new_student GET /students/new(.:format)      students#new 
       edit_student GET /students/:id/edit(.:format)     students#edit 
        student GET /students/:id(.:format)      students#show 
          PUT /students/:id(.:format)      students#update 
          DELETE /students/:id(.:format)      students#destroy 
         trips GET /trips(.:format)        trips#index 
          POST /trips(.:format)        trips#create 
        new_trip GET /trips/new(.:format)       trips#new 
        edit_trip GET /trips/:id/edit(.:format)     trips#edit 
         trip GET /trips/:id(.:format)       trips#show 
          PUT /trips/:id(.:format)       trips#update 
          DELETE /trips/:id(.:format)       trips#destroy 
       safety_tests GET /safety_tests(.:format)      safety_tests#index 
          POST /safety_tests(.:format)      safety_tests#create 
      new_safety_test GET /safety_tests/new(.:format)     safety_tests#new 
      edit_safety_test GET /safety_tests/:id/edit(.:format)    safety_tests#edit 
       safety_test GET /safety_tests/:id(.:format)     safety_tests#show 
          PUT /safety_tests/:id(.:format)     safety_tests#update 
          DELETE /safety_tests/:id(.:format)     safety_tests#destroy 
       medical_forms GET /medical_forms(.:format)      medical_forms#index 
          POST /medical_forms(.:format)      medical_forms#create 
      new_medical_form GET /medical_forms/new(.:format)     medical_forms#new 
      edit_medical_form GET /medical_forms/:id/edit(.:format)   medical_forms#edit 
       medical_form GET /medical_forms/:id(.:format)     medical_forms#show 
          PUT /medical_forms/:id(.:format)     medical_forms#update 
          DELETE /medical_forms/:id(.:format)     medical_forms#destroy 
    parent_permission_forms GET /parent_permission_forms(.:format)   parent_permission_forms#index 
          POST /parent_permission_forms(.:format)   parent_permission_forms#create 
    new_parent_permission_form GET /parent_permission_forms/new(.:format)  parent_permission_forms#new 
edit_parent_permission_form GET /parent_permission_forms/:id/edit(.:format) parent_permission_forms#edit 
     parent_permission_form GET /parent_permission_forms/:id(.:format)  parent_permission_forms#show 
          PUT /parent_permission_forms/:id(.:format)  parent_permission_forms#update 
          DELETE /parent_permission_forms/:id(.:format)  parent_permission_forms#destroy 
    teacher_permission_forms GET /teacher_permission_forms(.:format)   teacher_permission_forms#index 
          POST /teacher_permission_forms(.:format)   teacher_permission_forms#create 
new_teacher_permission_form GET /teacher_permission_forms/new(.:format)  teacher_permission_forms#new 
edit_teacher_permission_form GET /teacher_permission_forms/:id/edit(.:format) teacher_permission_forms#edit 
    teacher_permission_form GET /teacher_permission_forms/:id(.:format)  teacher_permission_forms#show 
          PUT /teacher_permission_forms/:id(.:format)  teacher_permission_forms#update 
          DELETE /teacher_permission_forms/:id(.:format)  teacher_permission_forms#destroy 
       trip_deposits GET /trip_deposits(.:format)      trip_deposits#index 
          POST /trip_deposits(.:format)      trip_deposits#create 
      new_trip_deposit GET /trip_deposits/new(.:format)     trip_deposits#new 
      edit_trip_deposit GET /trip_deposits/:id/edit(.:format)   trip_deposits#edit 
       trip_deposit GET /trip_deposits/:id(.:format)     trip_deposits#show 
          PUT /trip_deposits/:id(.:format)     trip_deposits#update 
          DELETE /trip_deposits/:id(.:format)     trip_deposits#destroy 
        trip_fees GET /trip_fees(.:format)       trip_fees#index 
          POST /trip_fees(.:format)       trip_fees#create 
       new_trip_fee GET /trip_fees/new(.:format)      trip_fees#new 
       edit_trip_fee GET /trip_fees/:id/edit(.:format)    trip_fees#edit 
        trip_fee GET /trip_fees/:id(.:format)      trip_fees#show 
          PUT /trip_fees/:id(.:format)      trip_fees#update 
          DELETE /trip_fees/:id(.:format)      trip_fees#destroy 
        team_dues GET /team_dues(.:format)       team_dues#index 
          POST /team_dues(.:format)       team_dues#create 
       new_team_due GET /team_dues/new(.:format)      team_dues#new 
       edit_team_due GET /team_dues/:id/edit(.:format)    team_dues#edit 
        team_due GET /team_dues/:id(.:format)      team_dues#show 
          PUT /team_dues/:id(.:format)      team_dues#update 
          DELETE /team_dues/:id(.:format)      team_dues#destroy 

我怎樣才能獲得兩行工作?

回答

0

找到了答案。這是適用於JS和HTML的代碼:

<%= form_for(safety_test, method: :delete, remote: true, html: {class: "delete_safety_test"}) do |f| %> 
    <%= f.submit "Delete", confirm: "Are you sure?" %> 
<% end %> 
+0

下垂者請解釋他/她自己嗎? – LonelyWebCrawler

1
respond_to do |format| 
    format.html { redirect_to(url_for(controller: 'students', action: 'show', id: student_id), notice: 'Safety test deleted successfully.') } # actually can be without url_for 
    format.js { render nothing: true } 
end 

第二個原因可以是HTML請求不包含DELETE方法,所以ActionDispatch想你請求:在SafetyTestsController行動=>「秀」。覈實。

<%= link_to 'Delete', {controller: 'safety_tests', action: 'destroy', id: safety_test.id}, remote: true, method: :delete, :data => { confirm: 'Are you sure?' }, id: "delete_safety_test" %> 

你爲什麼不使用命名的路線?:

<%= link_to 'Delete', safety_test, remote: true, method: :delete, :data => { confirm: 'Are you sure?' }, id: "delete_safety_test" %> 
+0

此修復了500服務器錯誤,但HTML請求仍然失敗。我發現你的第二個理由是正確的:按鈕上的'href'導致'show'動作,而不是'destroy'動作。我將編輯我的文章並添加用於生成按鈕的代碼,以便我們修復它。 – LonelyWebCrawler

+0

立即嘗試併發布您的DOCTYPE –

+0

DOCTYPE只是'<!DOCTYPE html>'。你給我的代碼有效,但仍然對'show'產生'href',而不是'destroy'動作。所以請求HTML時的錯誤仍然存​​在。 – LonelyWebCrawler