尝试将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 %>
答案 0 :(得分: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
。
如果您使用的是Devise,您还可以使用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?
。
答案 1 :(得分:0)
要让Devise进行身份验证并设置current_user
,您可以在控制器中包含以下before_action
:
before_action :authenticate_user!
如果您只想对特定操作的用户进行身份验证:
before_action :authenticate_user!, only: [:new, :update]
如果您要对所有控制器的用户进行身份验证,只需将其放入ApplicationController