2015-10-23 17 views
1

我正在構建包含分層管理權限的博客。當我使用我們的種子管理帳戶登錄時,我可以看到索引很好。當我轉到未登錄的頁面時,應該按before_action過濾的內容在我的索引視圖中出現錯誤,提示未定義的方法「admin ='爲nil:NilClass。未定義的方法僅在未登錄時

當我沒有登錄時,current_user應該爲零,並且視圖中的if語句應該解析爲false。以下代碼片段供參考。

這裏的觀點:

<div id="blog"> 

<%= render 'blogs/blog_header' %> 

<div class="messages"> 
    <%= render 'layouts/flash_messages' %> 
</div> 

<%= will_paginate @bloggers %> 

<% @bloggers.each do |blogger| %> 
    <div class="post_wrapper"> 
     <h2 class="title"><%= blogger.name %></h2> 
     <p class="date_and_author" style="display:inline"><%= blogger.email %></p> 
     <% if current_blogger.admin = 1 %> 
     <p class="date_and_author" style="display:inline">||</p> 
     <button class="button" style="display:inline"><%= link_to "delete", blogger, method: :delete, 
              data: { confirm: "You sure?" } %></button> 
     <% end %> 
    </div> 
<% end %> 

<%= will_paginate %> 

控制器:

class BloggersController < ApplicationController 
before_action :signed_in_blogger, only: [:show, :edit, :update, :destroy] 

# GET /bloggers 
# GET /bloggers.json 
def index 
    @bloggers = Blogger.paginate(page: params[:page], per_page: 20) 
end 

# GET /bloggers/1 
# GET /bloggers/1.json 
def show 
    @blogger = Blogger.find(params[:id]) 
end 

# GET /bloggers/new 
def new 
    @blogger = Blogger.new 
end 

# GET /bloggers/1/edit 
def edit 
end 

# POST /bloggers 
# POST /bloggers.json 
def create 
    @blogger = Blogger.new(blogger_params) 
    if @blogger.save 
     blog_sign_in @Blogger 
     flash.now[:success] = "New account successfully created." 
     redirect_to "/blogs" 
    else 
    render 'new' 
    end 
end 

# PATCH/PUT /bloggers/1 
# PATCH/PUT /bloggers/1.json 
def update 
    respond_to do |format| 
    if @blogger.update(blogger_params) 
     format.html { redirect_to @blogger, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @blogger } 
    else 
     format.html { render :edit } 
     format.json { render json: @blogger.errors, status: :unprocessable_entity } 
    end 
    end 
end 

# DELETE /bloggers/1 
# DELETE /bloggers/1.json 
def destroy 
    Blogger.find(params[:id]).destroy 
    respond_to do |format| 
    format.html { redirect_to bloggers_url, notice: 'User was successfully destroyed.' } 
    format.json { head :no_content } 
    end 
end 

private 

def blogger_params 
    params.require(:blogger).permit(:name, :email, :password, :admin, :password_confirmation) 
end 

# Confirms a signed-in user 
def signed_in_blogger 
    unless blog_signed_in? 
     flash[:error] = "Please sign in." 
     redirect_to blog_signin_path 
     end 
    end 
end 

和輔助:

# Logs in the given blogger 
def blog_sign_in(blogger) 
    session[:blogger_id] = blogger.id 
end 

# Returns the current logged-in blogger (if any) 
def current_blogger 
    @current_blogger ||= Blogger.find_by(id: session[:blogger_id]) 
end 

# Returns true if the blogger is logged in, false otherwise. 
def blog_signed_in? 
    !current_blogger.nil? 
end 

def blog_sign_out 
    session[:blogger_id] = nil 
    @current_blogger = nil 
end 

難道這是有點關係到一個單獨的錯誤WH當創建一個新的博客時,在創建後,我得到「未定義的方法ID爲nil:Class?」任何幫助將不勝感激。每個請求

粘貼博客模式:

class Blogger < ActiveRecord::Base 
attr_accessible :name, :email, :password, :password_confirmation, :admin, :remember_token 
has_secure_password 

before_save { self.email = email.downcase } 
before_create :create_remember_token 
validates :name, presence: true, length: { maximum: 50 } 
VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: true 
validates :password, length: { minimum: 5 } 
validates :password_confirmation, presence: true 

def Blogger.new_remember_token 
    SecureRandom.urlsafe_base64 
end 

def Blogger.digest(token) 
    Digest::SHA1.hexdigest(token.to_s) 
end 

private 

def create_remember_token 
    self.remember_token = Blogger.digest(Blogger.new_remember_token) 
end 
end 
+0

首先是錯誤的。你將它分配給值1,如果應該像這樣檢查值'如果current_blogger.admin == 1' – Cyzanfar

+0

是的,你是對的,拍攝。修正了它,但這並沒有解決問題。仍然得到相同的錯誤。 – Jeastburn

+0

未定義的方法ID? – Cyzanfar

回答

3

如果您還沒有登錄和current_bloggernil正如你所說,admin不會是一個有效的方法。爲了避免這個錯誤,將視圖中的if語句改爲像這樣。

<% if current_blogger && current_blogger.admin == 1 %> 

您也可以使用try方法,這也將工作中的所有`current_blogger.admin`檢查

<% if current_blogger.try(:admin) == 1 %> 
+0

嗯,所以它解決了未登錄時查看的問題,但現在不允許管理員刪除用戶。試了兩行代碼。 – Jeastburn

+0

你現在得到的錯誤信息是什麼? – Cyzanfar

+0

沒有錯誤消息,所以代碼工作,似乎並沒有像以前那樣將用戶識別爲管理員。 – Jeastburn