2014-01-06 55 views
0

我有我想通過JS調用,但得到奇怪的錯誤一些簡單的動作,這裏是我的代碼:Rails的不正確行動呼籲

控制器:

class Admin::CEventsController < Admin::BaseController 
    def add_speaker 
    # speakers = session[:speakers] ? [] : session[:speakers] 
    # speakers << Partner.find(params[:id]) 
    # session[:speakers] << speakers.uniq 
    # @speakers = Partner.find(session[:speakers]) 
    # puts @speakers.inspect 
    end 

    def remove_speaker 
    # speakers = session[:speakers] 
    # speakers.destroy(params[:id]) 
    # session[:speakers] = speakers 
    # @speakers = Partner.find(session[:speakers]) 
    end 
end 

路線:

resources :c_events,   :except => [:show] do 
     member do 
     post :add_speaker 
     post :remove_speaker 
     end 
    end 

查看:

<div class="row"> 
    <div class="small-6 columns"> 
    <% speakers.each do |p| %> 
     <p><%= link_to p.name remove_speaker_admin_c_event_path(p), :method => :post, :remote => true %></p> 
    <% end %> 
    </div> 

    <div class="small-6 columns"> 
    <% Partner.all.each do |p| %> 
     <p><%= link_to p.name, add_speaker_admin_c_event_path(p), :method => :post, :remote => true %></p> 
    <% end %> 
    </div> 
</div> 

我評論的一些操作的代碼只是爲了嘗試查找問題。 我得到的錯誤是:

開始POST 「/管理/ c_events/2/add_speaker」 爲127.0.0.1在 2014年1月6日21時38分25秒+0200處理由 聯繫:: CEventsController #add_speaker as JS參數:{「id」=>「2」}
CEvent加載(0.1ms)SELECT「c_events」。* FROM「c_events」WHERE 「c_events」。「id」=? LIMIT 1 [[ 「ID」, 「2」]]已完成404未在12毫秒

的ActiveRecord :: RecordNotFound實測值(無法與ID = 2找到CEvent的):

好像另一個動作被稱爲,在此控制器中的另一個行動是標準CRUD欄杆交易

+0

期望的操作看起來確實是正確調用的,正如您在日誌輸出中所證明的那樣:「Processing by Admin :: CEventsController#add_speaker'。在「Admin :: CEventsController」或「Admin :: BaseController」控制器中是否有任何'before_filter',可能試圖加載'CEvent'對象? –

+0

它看起來像你傳遞錯誤的ID參數。 –

+0

@Teeg我在Admin :: BaseController中有一個before_filter,但它只是設計授權(當前用戶具有管理權限)。我無法識別控制器在哪裏嘗試加載CEvent對象。以下是完整的控制器代碼http://upl.io/dx69ll – maki

回答

1

這是一個部分的答案,因爲我不知道如何解決您的問題,但我至少可以告訴你它在哪裏,並希望給你一個想法,所以你可以找出其餘的。

基於堆棧跟蹤,它看起來像你正在使用的CanCan寶石。顯然,它攔截了請求得到它之前,你的動作,就證明了這堆棧跟蹤的這一部分:

... 
activerecord (3.2.14) lib/active_record/querying.rb:5:in `find' 
cancan (1.6.10) lib/cancan/model_adapters/abstract_adapter.rb:20:in `find'<- here 
cancan (1.6.10) lib/cancan/controller_resource.rb:116:in `find_resource' 
... 

不幸的是,我不熟悉這個庫。然而,瀏覽他們的wiki page後,我能找到有關conditionally checking authorization此信息。

根據該頁面中,你也許能逃脫這樣的:

skip_authorization_check :only => [:add_speaker, :remove_speaker] 

我認爲這樣做會抑制CanCan的授權檢查,從而防止你的錯誤。

+0

另外請注意:由於我不熟悉'CanCan',我不能告訴你這是否是一種不好的做法。希望它是可以接受的,但讓我知道。 –