我正在尝试仅在我的帖子视图中向管理员用户显示按钮,但我收到此错误:
未定义的方法`admin?'为零:NilClass
摘录来源:
<% 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 %>
这是我的“用户”表:
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
这是我的“帖子”表:
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
这是我的Sessions_helper.rb中的current_user
方法,通过include SessionsHelper
在我的application_controller.rb中使用。
# 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
如何解决此错误?非常感谢你。
答案 0 :(得分:1)
在致电#admin之前?你必须检查'current_user'(为什么不使用Devise?)实际上是否存在。检查用户是否确实已登录。如果#present?将返回false,甚至不会检查#admin?因此不会抛出异常。
<% if current_user.present? && current_user.admin? %>
但总的来说,我真的建议使用 cancancan gem,以便将来不再重复这些验证。
答案 1 :(得分:0)
基本上,您收到的错误是指您的current_user
未设置。因此,请尝试调试current_user方法,但我认为cookies.signed[:user_id]
或session[:user_id]
未设置,因此您无法找到没有id
的任何用户!
我的建议是打印整个session[:user_id]
&amp;&amp;在cookies.signed[:user_id]
方法的顶部current_user
,您将看到具体问题在哪里。
答案 2 :(得分:0)
您似乎正在比较两个值,如果我正确,那么您应该与==而不是=进行比较 例如 (user_id = session [:user_id])应该是(user_id == session [:user_id])