J'essaie d'afficher les boutons uniquement pour les utilisateurs administrateurs sur les vues de mes messages, mais j'obtiens cette erreur:

méthode non définie `admin? ' pour nul: NilClass

Source extraite:

<% if current_user.admin? && !current_user?(user) %>
  <%= link_to "Edit", edit_post_path(@post), class: "btn btn-warning" %>
  <%= link_to "Delete", post_path(@post),
                  method: :delete,
                  data: {confirm: "Are you sure you want to delete this blog post?"},
                  class: "btn btn-danger" %>
<% end %>

Voici mon tableau "utilisateurs":

create_table "users", force: :cascade do |t|
  t.string   "username"
  t.string   "first_last_name"
  t.string   "email"
  t.string   "password_digest"
  t.datetime "created_at",                        null: false
  t.datetime "updated_at",                        null: false
  t.string   "remember_digest"
  t.boolean  "admin",             default: false
  t.string   "activation_digest"
  t.boolean  "activated",         default: false
  t.datetime "activated_at"
  t.string   "reset_digest"
  t.datetime "reset_sent_at"
  t.index ["email"], name: "index_users_on_email", unique: true
  t.index ["username"], name: "index_users_on_username", unique: true
end

Voici mon tableau "posts":

create_table "posts", force: :cascade do |t|
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.string   "title"
  t.text     "body"
end

C'est ma méthode current_user dans mon Sessions_helper.rb qui est utilisée dans mon application_controller.rb via include SessionsHelper.

# Returns true if the given user is the current user.
def current_user?(user)
  user == current_user
end

# Returns the user corresponding to the remember token cookie.
def current_user
  if (user_id = session[:user_id])
    @current_user ||= User.find_by(id: user_id)
  elsif (user_id = cookies.signed[:user_id])
    user = User.find_by(id: user_id)
    if user && user.authenticated?(cookies[:remember_token])
      log_in user
      @current_user = user
    end
  end
end

Comment résoudre cette erreur? Merci d'avance.

0
Jake 10 août 2017 à 14:55

2 réponses

Meilleure réponse

Avant d'appeler #admin? vous devez vérifier si cet 'utilisateur_actuel' (pourquoi ne pas utiliser Devise?) existe réellement. vérifiez que l'utilisateur est bien connecté. si le #present? retournera false, il ne vérifiera même pas le #admin? et ne jettera donc pas d'exception.

<% if current_user.present? && current_user.admin? %>

Mais en général, je recommande vraiment d'utiliser la gemme cancancan afin que vous ne répétiez pas ces vérifications à l'avenir.

1
ran632 10 août 2017 à 13:44

Il semble que vous comparez deux valeurs, si j'ai raison, vous devriez comparer avec == à la place = par exemple (user_id = session [: user_id]) devrait être (user_id == session [: user_id])

0
john s 10 août 2017 à 12:18