我有一些简单的动作,我想通过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轨道动作
答案 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
的授权检查,从而防止您的错误。