2016-04-05 2 views
3

Я хочу, чтобы люди, которые не вошли в систему, чтобы увидеть страницу показа. Прямо сейчас они получают ошибку NoMethodError за current_user.correct_user без использования 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?

+0

В трассировке, какая линия имеет на появляется 'NoMethodError'? – Trip

+0

Посмотрите на мой ответ, также это похоже на близкий вопрос к этому http://stackoverflow.com/questions/36407790/rails-user-profile-page-only-accessible-to-correct-user/36407884#36407884 – 7urkm3n

+0

Уточненный вопрос @Поездка. Он появляется для '@ correct_user' в представлении, потому что' current_user' is nil –

ответ

1
if current_user 
    @correct_user = current_user.challenges.find_by(id: params[:id]) 
else 
    @correct_user = nil 
end 
+1

вы можете поместить это в тройной, если хотите .. просто стилистический переписать '@correct_user = current_user? current_user.challenges.find_by (id: params [: id]): nil'. Рад, что ты справился! – Trip

0

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

1

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

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

Это должно помочь определить 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 
+0

Спасибо за вашу помощь! Проблема заключается в том, что я хочу, чтобы не пользователи отображали страницу показа, но у меня есть условное выражение в представлении, которое использует '<% if @correct_user%>' отображение материала для пользователя, который сделал вызов '<% else %>' показать всем остальным, что означало бы вошедшие в систему пользователи и незарегистрированные пользователи '<% end %>' Ваш ответ перенаправляет всех, чего я не хочу. Я обновлю вопрос. Извините за недопонимание! –

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