Rails不正确的动作调用

时间:2014-01-06 19:47:31

标签: ruby-on-rails cancan

我有一些简单的动作,我想通过js调用但是出现了奇怪的错误,这是我的代码:

控制器:

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>

我评论了一些动作代码,试图找到问题所在。 我得到的错误是:

  

在127.0.0.1开始POST“/ admin / c_events / 2 / add_speaker”   2014-01-06 21:38:25 +0200加工方式   Admin :: CEventsController#add_speaker as JS参数:{“id”=&gt;“2”}
  CEvent加载(0.1ms)SELECT“c_events”。* FROM“c_events”WHERE   “c_events”。“id”=? LIMIT 1 [[“id”,“2”]]已完成404未找到   12ms的

     

ActiveRecord :: RecordNotFound(无法找到id = 2的CEvent):

似乎调用了另一个动作,此控制器中的另一个动作是标准的CRUD轨道动作

1 个答案:

答案 0 :(得分:1)

这是一个部分答案,因为我不知道如何解决你的问题,但我至少可以告诉你它在哪里,并希望给你一个想法,以便你可以弄清楚其余的。

基于堆栈跟踪,看起来您正在使用CanCan gem。显然,在它进入你的行动之前它正在拦截请求,如堆栈跟踪的这一部分所证明的那样:

...
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的授权检查,从而防止您的错误。