2017-08-10 21 views
0

我想對我的帖子的觀點僅顯示admin用戶按鈕,但我得到這個錯誤:如何使用來自不同表的方法在Ruby on Rails的

undefined method `admin?' for nil: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是在我application_controller.rb通過include SessionsHelper使用current_user方法。

# 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

你登錄了嗎?是否設置了session [:user_id]?是否設置了cookies.signed [:user_id]?用戶('User.find_by(...)')是否真的存在?你期待什麼行爲? –

+0

在測試之前如果'current_user'是一個管理員,你應該測試用戶是否被認證(通常是一個幫助器方法'logged_in?') – MrYoshiji

+0

不,我沒有登錄,但我希望頁面加載爲未記錄在觀衆中,因爲這是一篇博文。 – Jake

回答

1

致電之前#admin?你必須檢查'current_user'(爲什麼不使用Devise?)實際上是否存在。檢查用戶是否實際登錄。如果#present?將返回false,它甚至不會檢查#admin?因此不會拋出異常。

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

但總體來說,我真的建議使用cancancan寶石讓你不會在未來的核查重複自己。

+0

我沒有使用Devise,因爲我想了解更多信息,並選擇使用[Railstutorial]中的代碼(https://www.railstutorial.org/book/updating_and_deleting_users) – Jake

+0

哇,這實際上效果很好,博客文章現在正在工作即使對於未登錄的觀衆也是如此。我不能夠感謝你,我一直堅持在這個問題上堅持一週,如果我能幫助你,請讓我知道! – Jake

+0

NP @Jake祝你好運! :) –

0

基本上你會得到一個錯誤,意味着你的current_user沒有設置。因此,請嘗試調試您的current_user方法,但我認爲cookies.signed[:user_id]session[:user_id]未設置,因此如果沒有id,您將找不到任何用戶!

我的建議是打印整個session[:user_id] & & cookies.signed[:user_id]current_user方法的頂部,你會看到的是具體問題。

0

看來你比較兩個值,如果我是正確的,那麼你應該用比較==而不是= 如 (USER_ID =會話[:USER_ID])應該是(USER_ID ==會話[:USER_ID])