Перенаправление не работает - PullRequest
4 голосов
/ 25 марта 2011

У меня есть строка в контроллере голосов:

before_filter :authenticate

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

Мой метод аутентификации в контроллере приложения выглядит следующим образом:

def authenticate
    logged_in? ? true : access_denied
end

Так что возвращается access_denied, который выглядит так:

def access_denied
    redirect_to login_path, :notice => "You must log in to perform this action." and return false
end

Поэтому я должен быть перенаправлен на мою страницу входа, верно?

У меня есть это в моем файле rout.rb:

match '/login' => "sessions#new", :as => "login"

и у меня есть представление new с формой входа в систему, на которое я должен быть перенаправлен, когда я голосую, и я не вошел в систему. У меня также есть этот код в методе create моего контроллера голосов:

if @vote.save
    respond_to do |format|
      format.html { redirect_to @video }
      format.js
    end
  else
    respond_to do |format|
      format.html
    end
  end

Но когда я голосую, меня не перенаправляют, и я получаю это сообщение об ошибке в своих журналах:

Started GET "/login" for 127.0.0.1 at Thu Mar 24 21:18:08 -0700 2011
  Processing by SessionsController#new as JS
Completed   in 17ms

ActionView::MissingTemplate (Missing template sessions/new with {:locale=>[:en, :en], :formats=>[:js, "*/*"], :handlers=>[:rhtml, :rxml, :erb, :builder, :rjs]} in view paths "/rubyprograms/dreamstill/app/views"):

Почему это происходит, и как я могу заставить это перенаправление работать?

Ответы [ 2 ]

6 голосов
/ 25 марта 2011

Похоже, что вы делаете запрос javascript для своего действия VotesController # create, но вам не хватает шаблона JS для Sessions # new.

Вот что происходит: вы делаете вызов VotesController # create как вызов JS, и когда пользователь входит в систему, все в порядке, потому что VotesController # создает ответ на действия javascript. Проблема заключается в том, что если пользователь не вошел в систему, запрос перенаправляется на SessionsController # new, и этот запрос все еще является запросом javascript. Проблема в том, что SessionsController # new не отвечает на JS, поэтому вы получаете ошибку отсутствующего шаблона.

Я бы рекомендовал добавить файл app / views / session / new.js.erb для обработки вызова JS. Возможно, сейчас у вас есть только файл app / views / session / new.html.erb.

Вы также можете обработать этот случай, перенаправив, используя javascript, к запросу HTML. Вы можете сделать это, добавив в шаблон new.js.erb следующее:

window.location = "<%= escape_javascript(login_path) %>";

Это в основном скажет браузеру перенаправить на login_path, как если бы запрос был HTML-запросом, а не Javascript-запросом.

1 голос
/ 25 марта 2011

Поскольку запрос, вызывающий проблемы, является ajax, попробуйте добавить проверку в вашем before_filter, чтобы узнать, является ли запрос js.

if request.xhr?
    render :text => "document.location = '#{login_path}';", :layout => false
else
  redirect_to login_path, ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...