2014-01-06 5 views
0

У меня есть несколько простых действий, которые я хочу, чтобы позвонить с помощью 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> 

Я прокомментировал некоторые коды действий, чтобы попытаться найти проблему. Ошибка у меня есть:

работы POST "/ админ/c_events/2/add_speaker" для 127.0.0.1 на 2014-01-06 21:38:25 +0200 Обработка Администратор :: CEventsController #add_speaker as JS Parameters: {"id" => "2"}
CEvent Load (0.1ms) ВЫБЕРИТЕ «c_events». * FROM «c_events» WHERE «c_events». «id» =? LIMIT 1 [[ "ID", "2"]] Завершена 404 Не найдено 12ms

ActiveRecord :: RecordNotFound (Не удалось найти CEvent с идентификатором = 2):

Похоже еще действия вызывается, другие действия в этом контроллере являются стандартными CRUD-рельсами.

+0

Желаемое действие похоже на то, что оно действительно называется правильно, о чем свидетельствует это в вашем выходном файле журнала: 'Обработка по Admin :: CEventsController # add_speaker'. Есть ли 'before_filter' в контроллерах' Admin :: CEventsController' или 'Admin :: BaseController', которые могут пытаться загрузить объект' CEvent'? –

+0

Похоже, вы проходите неправильный параметр ID. –

+0

@Teeg У меня есть before_filter в Admin :: BaseController, но это просто образец разрешения для разработки (у текущего пользователя есть права администратора). Я не могу определить, где контроллер пытается загрузить объект CEvent. вот полный код контроллера http://upl.io/dx69ll – maki

ответ

1

Это частичный ответ, потому что я точно не знаю, как решить вашу проблему, но я могу, по крайней мере, сказать вам, где он находится, и, надеюсь, дать вам идея, чтобы вы могли понять остальное.

Основываясь на stacktrace, похоже, что вы используете драгоценный камень CanCan. По-видимому, он перехватывает запрос, прежде чем он попадет в ваше действие, о чем свидетельствует эту часть StackTrace:

... 
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 «s, предотвращая тем самым свою ошибку.

+0

Также обратите внимание: поскольку я не знаком с 'CanCan', я не могу сказать вам, является ли это плохой практикой. Надеюсь, это приемлемо, но дайте мне знать. –

Смежные вопросы