1

尝试将 rolify 方法应用于我的用户,我收到以下错误:

undefined method `has_role?' for nil:NilClass

我不明白为什么,因为 current_user 应该是每个视图都可以访问的全局方法,对吧?怎么可能是零?

谢谢!

控制器

def show
        @photo = Photo.friendly.find(params[:id])
        impressionist(@photo)
        @photos = Photo.latest_photos
        @user = @photo.user
        @pin = Pin.new
        @pin.photo_id = @photo.id
        @category = Category.all
        @commentable = @photo
        @comments = @commentable.comments
        @comment = Comment.new
        @sponsors = @photo.sponsors
        @zone = Zone.all
        respond_to do |format|
            format.html #show.html.erb
            format.json {render json: @photo}
        end
    end

我的观点

  <% if current_user.has_role? :admin %>
    <%= link_to "Eliminar", user_photo_pin_path(user_id: @user.id, photo_id: @photo.id, id: pin.id) , method: :delete, data: { confirm: 'Quieres borrar esto?'}, class: "delete right" %>
    <%= link_to 'Editar', edit_user_photo_pin_path(user_id: @user.id, photo_id: @photo.id, id: pin.id), :class=> "link", class: "edit quarter_margin_right right" %>
    <% end %>
<% end %>
4

2 回答 2

3

您需要检查current_user您的视图中是否有:

<% if current_user && current_user.has_role?(:admin) %>
    <%= link_to "Eliminar", user_photo_pin_path(user_id: @user.id, photo_id: @photo.id, id: pin.id) , method: :delete, data: { confirm: 'Quieres borrar esto?'}, class: "delete right" %>
    <%= link_to 'Editar', edit_user_photo_pin_path(user_id: @user.id, photo_id: @photo.id, id: pin.id), :class=> "link", class: "edit quarter_margin_right right" %>
    <% end %>
<% end %>

这使用布尔短路 - 如果 current_user 为 nil 则 current_user.has_role? :admin永远不会评估。

如果您使用的是设计,您也可以使用user_signed_in?辅助方法。

添加。

如果您发现自己经常这样做,您可以创建一个辅助方法:

# app/helpers/roles_helper.rb
module RolesHelper
  def has_role?(role)
    current_user && current_user.has_role?(role)
  end
end

然后,您可以简化您的视图:

<% if has_role?(:admin) %>
    <%= link_to "Eliminar", user_photo_pin_path(user_id: @user.id, photo_id: @photo.id, id: pin.id) , method: :delete, data: { confirm: 'Quieres borrar esto?'}, class: "delete right" %>
    <%= link_to 'Editar', edit_user_photo_pin_path(user_id: @user.id, photo_id: @photo.id, id: pin.id), :class=> "link", class: "edit quarter_margin_right right" %>
<% end %>

请注意,我们正在调用has_role?视图上下文。

于 2014-10-27T10:32:48.280 回答
0

要让 Devise 进行身份验证和设置,您可以在控制器current_user中包含以下内容:before_action

before_action :authenticate_user!

如果您只想对特定操作的用户进行身份验证:

before_action :authenticate_user!, only: [:new, :update]

如果要对所有控制器的用户进行身份验证,只需将其放入ApplicationController

于 2014-10-27T10:31:31.127 回答