rails3 before_filter вызывает остановку цепочки фильтров из-за ошибки :authenticate rendered or redirected

В моем index.html я использую ‹%= render 'rates/rate_form'%>, чтобы отобразить форму ставки, а форма - ajax. Содержимое _rate_form:

   `<%= form_for [@image, Rate.new], :remote=>true do |f| %>  
<input type="hidden" name="image_id" value="<%= @image.id%>"/>
<button type="submit"> Rate</button>
<% end %>`

В моем контроллере ставок я определил один фильтр before_filter, только вошедший в систему может создать скорость. class RatesController ‹ ApplicationController before_filter :authenticate, :only=> :create

def create
@rate=Rate.new(:rate=>1)

respond_to do |format|
  if @rate.save
    format.html { redirect_to(@rate) }
    format.js 
  end
end
end

в моем файле session_helper:

 def authenticate
   redirect_to signin_url unless signed_in? 
 end

Журнал:

Redirected to http://localhost:3000/signin
Filter chain halted as :authenticate rendered or redirected
Completed 302 Found in 3ms (ActiveRecord: 0.7ms)


Started GET "/signin" for 127.0.0.1 at 2013-04-28 12:36:56 +0300
Processing by SessionsController#new as JS
Rendered sessions/new.html.erb within layouts/application (1.3ms)
User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."id" IS NULL LIMIT 1
Rendered sessions/new.html.erb (1.2ms)
Rendered layouts/_nav.html.erb (4.8ms)
Rendered layouts/_search.html.erb (0.6ms)
Rendered layouts/_notice_div.html.erb (0.1ms)
Completed 200 OK in 26ms (Views: 24.3ms | ActiveRecord: 0.9ms)

Когда я нажимаю кнопку «Оценить», в консоли появляется ошибка: Цепочка фильтров остановлена, так как :deny_access отображается или перенаправляется. У вас есть идеи, как это решить? Большое спасибо!


person user1611237    schedule 27.04.2013    source источник


Ответы (1)


Итак, у вас есть фильтр, который запускается перед каждым выполнением действия создания. Что он делает, так это то, что он перенаправляет безоговорочно. Фактически это означает, что никто никогда не сможет вызвать действие создания. Я предполагаю, что должна быть какая-то проверка внутри deny_access, которая проверяет сеанс входа в систему или что-то в этом роде.

Сообщение, которое вы видите в журналах, просто информирует вас о том, что фильтр сделал перенаправление.

person moritz    schedule 27.04.2013
comment
на самом деле, функция отказа в доступе такова: конец - person user1611237; 27.04.2013
comment
... о, я этого не видел. Можете ли вы запустить сеанс отладчика прямо перед вызовом перенаправления. Каким-то образом sign_in? кажется, возвращает ложь. - person moritz; 28.04.2013
comment
Начат GET /signin для 127.0.0.1 в 2013-04-28 12:36:56 +0300 Обработка SessionsController#new как JS Отрисовка сеансов/new.html.erb в макетах/приложении (1,3 мс) Пользовательская нагрузка (0,9 мс) ВЫБЕРИТЕ пользователей.* ОТ пользователей, ГДЕ users.id IS NULL LIMIT 1 Визуализированные сеансы/new.html.erb (1,2 мс) Визуализированные макеты/_nav.html.erb (4,8 мс) Визуализированные макеты/_search.html.erb (0,6 мс) Rendered layouts/_notice_div.html.erb (0,1 мс) Привет, @moritz, вот лог, я заметил, что там написано «Обработка SessionsController#new как JS», я думаю, это должно быть как HTML, верно? - person user1611237; 28.04.2013
comment
Это зависит от того, как сделан ваш интерфейс. Итак, /signin обрабатывает POST и GET? - person moritz; 28.04.2013
comment
спасибо, я сделал это с помощью render:js=›window.location='/signin/', теперь это работает - person user1611237; 28.04.2013