correct_user без использования current_user?

Я хочу, чтобы люди, которые не вошли в систему, могли видеть страницу шоу. Прямо сейчас они получают ошибку NoMethodError для current_user.

def show
  @correct_user = current_user.challenges.find_by(id: params[:id])
end

sessions_helper

  # Returns the current logged-in user (if any).
  def current_user
    if (user_id = session[:user_id])
      @current_user ||= User.find_by(id: user_id)
    elsif (user_id = cookies.signed[:user_id])
      user = User.find_by(id: user_id)
      if user && user.authenticated?(:remember, cookies[:remember_token])
        log_in user
        @current_user = user
      end
    end
  end

Я использую @correct_user, потому что хочу показать только определенные вещи создателю задачи:

<% if @correct_user %>
  # show stuff to user who made challenge  
<% else %>
  # show to everyone else, which would mean logged in users and non logged in users 
<% end %> 

Как я могу разрешить пользователям, не вошедшим в систему, видеть страницу шоу, за исключением того, что подпадает под @correct_user?


person AnthonyGalli.com    schedule 05.04.2016    source источник
comment
В какой строке трассировки появляется NoMethodError?   -  person Trip    schedule 06.04.2016
comment
посмотрите на мой ответ, также это похоже на близкий вопрос к этому stackoverflow.com/questions/36407790/   -  person 7urkm3n    schedule 06.04.2016
comment
Уточненный вопрос @Trip. Он отображается для @correct_user в представлении, потому что current_user равен нулю.   -  person AnthonyGalli.com    schedule 06.04.2016
comment
Последний html.erb бит, который у вас есть, if @correct_user должен быть вашим ответом. Это не обязательно должно быть if else, это также может быть if !@correct_user и if @correct_user. Не могли бы вы объяснить, почему вы используете слово correct? Я до сих пор не совсем понимаю, что ты здесь задумал   -  person Trip    schedule 07.04.2016
comment
Кажется, я понял @trip. Я добавил ответ ниже. Вы были наиболее на правильном пути :]   -  person AnthonyGalli.com    schedule 07.04.2016


Ответы (4)


Это должно помочь определить, что current_user верен.

class UsersController < ApplicationController    
    before_action :set_challenge, only: :show
    before_action :check_user, only: :show

    private 

  def set_ challenge
     @challenge = Challenge.find(params[:id])
  end


    def check_user
      if current_user.id != @challenge.user_id
        redirect_to root_url, alert: "Sorry, You are not allowed to be here, Bye Bye ))"
      end
    end
end
person 7urkm3n    schedule 05.04.2016
comment
Спасибо за вашу помощь! Проблема в том, что я хочу, чтобы не-пользователи видели страницу показа, но у меня есть условие в представлении, которое использует <% if @correct_user %> показать материал пользователю, который сделал вызов <% else %> показать всем остальным, что будет означать вошедших в систему пользователей и незарегистрированных пользователей <% end %> Ваш ответ перенаправляет всех, чего я не хочу. Я обновлю вопрос. Извините за недопонимание! - person AnthonyGalli.com; 06.04.2016

Вызов .challenges на current_user, если current_user является null, приведет к ошибке.

def show
  if current_user
    @correct_user = current_user.challenges.find_by(id: params[:id])
  end
end
person Trip    schedule 05.04.2016

Более чем вероятно, что current_user возвращает nil, поэтому метод вызовов не может быть запущен и дает вам NoMethodError

person Justin    schedule 05.04.2016

person    schedule
comment
вы можете поместить это в тройку, если хотите.. просто стилистически переписать @correct_user = current_user ? current_user.challenges.find_by(id: params[:id]) : nil . Рад, что у вас получилось! - person Trip; 08.04.2016