У меня есть оператор if, который отображает определенную ссылку в зависимости от того, проголосовал ли пользователь за что-то или нет. Однако я получу сообщение об ошибке, если пользователь не вошел в систему, поскольку current_user будет равен нулю. Я использую устройство для аутентификации.

неопределенный метод voted_as_when_voted_for для nil: NilClass

               <% if current_user.voted_as_when_voted_for @pin %>                                                                                                                                                
                  <%= link_to dislike_pin_path(@pin), method: :put, class: "btn btn-default" do %>                                                                                                                
                      <span class="glyphicon glyphicon-heart"></span>                                                                                                                                                                   <%= @pin.get_upvotes.size %>                                                                                                                                                                
                  <% end %>                                                                                                                                                                                       
                <% else %>                                                                                                                                                                                        
                  <%= link_to like_pin_path(@pin), method: :put, class: "btn btn-default" do %>                                                                                                                   
                      <span class="glyphicon glyphicon-heart"></span>                                                                                                                                             
                      <%= @pin.get_upvotes.size %>                                                                                                                                                                
                  <% end %>                                                                                                                                                                                       
                <% end %>                                                                                                                                                                                         
                <%= link_to pins_path, class: "btn btn-default" do %>                                                                                                                                             
                    <span class="glyphicon glyphicon-step-backward"></span>                                                                                                                                       
                    Back                                                                                                                                                                                          
                <% end %>                                                                                                                                                                                         
                <% if user_signed_in? %>                                                                                                                                                                          
                  <%= link_to "Edit", edit_pin_path, class: "btn btn-default" %>                                                                                                                                  
                  <%= link_to "Delete", pin_path, method: :delete, data: { confirm: "Are you sure"}, class: "btn btn-default" %>                                                                                  
                <% end %>           

Что я могу добавить к этому оператору if для отображения одной из ссылок, даже если пользователь не вошел в систему, без повторения кода link_to. Использование методологии DRY Rails. (если пользователь не вошел в систему и нажимает ссылку «Нравится / Не нравится», он попросит его войти в систему, поскольку мои маршруты настроены следующим образом:

before_action :authenticate_user!, except: [:index, :show] 
1
CodeCrack 5 Мар 2015 в 10:58

2 ответа

Лучший ответ

Попробуй это:

<% if current_user && current_user.voted_as_when_voted_for @pin %>
   ... code here
<% else %> 
  <%= link_to like_pin_path(@pin), method: :put, class: "btn btn-default" do %>                                                                                                                   
    <span class="glyphicon glyphicon-heart"></span>                                                                                                                                             
    <%= @pin.get_upvotes.size %>                                                                                                                                                                
  <% end %> 
<% end %>
1
patrick 5 Мар 2015 в 08:08

В твоем случае:

<% if signed_in? && current_user.voted_as_when_voted_for @pin %>
  ...
<% end %>

Предполагая, что вы используете devise, поскольку вы включили Authenticate_user! метод.

0
NM Pennypacker 5 Мар 2015 в 08:14