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は評価されません。

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?ビューコンテキストで呼び出していることに注意してください。

于 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 に答える