根据用户是否登录显示内容的最佳方式

时间:2015-03-05 07:58:04

标签: ruby-on-rails devise

我有一个if语句,如果用户投票或不投票,则显示某些链接。但是,如果用户未登录,我将收到错误,因为current_user将为nil。我正在使用设计进行身份验证。

  

未定义的方法`voted_as_when_voted_for'为零: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 %>           

即使用户未登录而没有重复link_to代码,我还可以添加if if语句来显示其中一个链接。使用DRY Rails方法。 (如果用户没有登录并点击喜欢/不喜欢链接,它会要求他登录,因为我的路由设置如下:

before_action :authenticate_user!, except: [:index, :show] 

2 个答案:

答案 0 :(得分:1)

试试这个:

<% 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 :(得分:0)

在你的情况下:

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

假设您使用了设计,因为您包含了authenticate_user!方法