Ruby on Rails Thumbs_up Перенаправление на вход пользователя

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

неопределенный метод `vote_for' для nil:NilClass

У меня есть обычный скаффолд «Пост», и пользователи голосуют за сообщения. Как мне вставить команду, которая перенаправляет их на user_sign_in, если они еще не вошли в систему?

class PostsController < InheritedResources::Base
  def vote_up
  begin
  current_user.vote_for(@post = Post.find(params[:id]))
  redirect_to [@post]
  flash[:success] = "You have voted successfully"
rescue ActiveRecord::RecordInvalid
  redirect_to [@post]
  flash[:error] =  "You have already voted"
  end
 end

end

person mystic cola    schedule 13.07.2013    source источник


Ответы (1)


Добавьте before_filter :authenticate_user! в свой PostController. В методе authenticate_user! проверьте сеанс пользователя и, если пользователь не авторизован, перенаправьте на путь sign_in.

Редактировать: Поскольку у вас уже есть Devise, добавление before_filter должно позаботиться о перенаправлении для входа в систему, если пользователь не вошел в систему. Следующее будет работать только для действия vote_up, если вы хотите, чтобы одинаковое поведение для всех действий, то вы можете заменить строку на before_filter :authenticate_user!

class PostsController < InheritedResources::Base 
  # Add before_filter here and devise should handle the redirection if the user is not signed in.
  before_filter :authenticate_user!, only: [:vote_up]

  def vote_up
  begin
  current_user.vote_for(@post = Post.find(params[:id]))
  redirect_to [@post]
  flash[:success] = "You have voted successfully"
rescue ActiveRecord::RecordInvalid
  redirect_to [@post]
  flash[:error] =  "You have already voted"
  end
 end

end
person vee    schedule 13.07.2013
comment
Я обновил свой пост с помощью контроллера сообщений, можете ли вы показать мне пример шоу, чтобы сделать это именно так? - person mystic cola; 13.07.2013
comment
У вас есть аутентификация? Как вы аутентифицируете пользователей? - person vee; 13.07.2013
comment
Devise... И Omniauth... и еще парочка вещей. Но да: у меня есть authentication_user! на месте. - person mystic cola; 13.07.2013
comment
Пожалуйста, смотрите мое редактирование выше. Я предполагаю, что это должно позаботиться о перенаправлении ваших пользователей, если они не вошли в систему для действия vote_up. - person vee; 13.07.2013
comment
Пожалуйста, отредактируйте свой ответ (для других, конечно :)) Вы написали before_filter: и это должно быть before_filter. Но в остальном СПАСИБО! Оно работает! :D - person mystic cola; 13.07.2013