Действует как ошибка Votable после выхода пользователя из системы - PullRequest
0 голосов
/ 16 января 2020

Я реализовал функцию votable, все работает хорошо, пока пользователь входит в систему, как только пользователь выходит из системы, я получаю следующую ошибку.

		undefined method `voted_up_on?' for nil:NilClass

Мой индекс. html .erb

<p class="small-text float center ">
						<% if current_user.voted_up_on?(startup) %>
							<%= link_to '<i class="material-icons md-light">change_history</i>
							</br>'.html_safe, downvote_startup_path(startup), method: :put %>	
							<small>votes: <%= startup.get_upvotes.size %></small> 		
						

						<% current_user && current_user.voted_down_on?(startup) %>
							<%= link_to  '<i class="material-icons md-dark">change_history</i>
							</br> '.html_safe, upvote_startup_path(startup), method: :put  %> 
							<small>votes: <%= startup.get_upvotes.size %></small> 
						<% end %>
					</p>

Мой контроллер

before_action :find_startup, only: [:show, :edit, :destroy, :update, :upvote, :downvote]

def upvote
		@startup.upvote_from current_user
		redirect_to @startup, notice: "Upvoted successfully!"
	end

	def downvote
		@startup.downvote_from current_user
		redirect_to @startup, notice: "downvoted successfully!"
	end

Мои маршруты

resources :startups do
    member do
      put :upvote
      put :downvote
    end
    resources :comments, only: [:create, :destroy]
  end

Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 16 января 2020

В вашем индексе. html .erb у вас есть эта строка кода <% if current_user.voted_up_on?(startup) %>, когда при выходе из системы current_user метод будет равен нулю. Убедитесь, что значение current_user не равно нулю, прежде чем рендерить лог c в вашем index.html.erb

что-то вроде

<% if current_user %>
  ...
  # your logic that makes use of current_user object goes here
  ...
<% end %>
1 голос
/ 16 января 2020

Проблема в том, что после выхода пользователя у вас нет current_user. Так что самым простым решением этого было бы убедиться, что сначала есть текущий пользователь.

<p class="small-text float center ">
  <% if current_user && current_user.voted_up_on?(startup) %>
    <%= link_to '<i class="material-icons md-light">change_history</i>
    </br>'.html_safe, downvote_startup_path(startup), method: :put %>   
    <small>votes: <%= startup.get_upvotes.size %></small>       
    <% end %> <--  couldn't find the closing end so maybe it goes here?         

    <% if current_user && current_user.voted_down_on?(startup) %>
        <%= link_to  '<i class="material-icons md-dark">change_history</i>
        </br> '.html_safe, upvote_startup_path(startup), method: :put  %> 
        <small>votes: <%= startup.get_upvotes.size %></small> 
   <% end %>
</p>

Ваш код был немного запутанным, я думаю, что вторая часть была также условной if, но, возможно, вы забыли написать if? В любом случае исправление - это проверка текущего пользователя в первом условном if, поскольку пользователь также может получить доступ к этой странице без входа в систему, поэтому вам необходимо проверить это, в противном случае вы звоните voted_up_on? на nil объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...