2013-04-04 36 views
1

我试图在视图中实现一些条件,如“编辑”和“删除”按钮应该只有当当前用户是我的应用程序管理员可见。当我在我的articles/index.html.erb页面中尝试<%if current_user.is_admin%>时,出现未定义的方法“is_admin”错误。NoMethodError在文章#索引undefined方法`is_admin'为零:NilClass

我不能在文章索引页面中使用设计的current_user方法来获取用户吗?请告诉我如何获取用户,然后检查用户是否是管理员。

我的代码文件都低于:

文章/ index.html.erb

<%- model_class = Article -%> 
<div class=""> 
    <h1><%=t '.title', :default => model_class.model_name.human.pluralize %></h1> 
</div> 

<div style="border: 1px solid #1763A4;border-radius: 4px 4px 4px 4px;margin: 0 0 20px; padding: 20px 20px 10px;"> 

    <% @articles.each do |article| %> 
    <div style="border: 1px solid #51702E;border-radius: 4px 4px 4px 4px;margin: 0 0 20px; padding: 20px 20px 10px;"> 
     <div style="color:#51702E"><h2><%= article.title %></h2></div> 
     <div style="color:#666666"> <%= article.created_at %></div> 
     <% if current_user.is_admin %> 
     <div> <%= truncate(article.body, :length => 500, :separator => ' ') %></div> 
    <%= link_to "edit",edit_article_path(article), :class => 'btn btn-warning btn' %> 
    <%= link_to "delete",article_path(article),:method => :delete,:confirm => 'Are you sure?',:class => 'btn btn-danger' %> 
    <% end %> 
    <%= link_to "VIEW MORE...",article_path(article), :class => 'btn btn-primary' %> 
    </li> 
    </div> 
    <% end %> 
<%= link_to "Create new Article", new_article_path, :class => 'btn btn-large btn-primary' %> 

articles_controller.rb

class ArticlesController < ApplicationController 
    def index 
     @articles = Article.all 
    end 

    def show 
     @article = Article.find(params[:id]) 
    end 

    def new 
     @article = Article.new 
    end 

    def create 
     @article = Article.new(params[:article]) 

     @article.save 
     redirect_to article_path(@article) 
    end 

    def destroy 
     @article = Article.find(params[:id]) 
     @article.destroy 
     redirect_to action: 'index' 
    end 

    def edit 
     @article = Article.find(params[:id]) 
    end 

    def update 
     @article = Article.find(params[:id]) 
     @article.update_attributes(params[:article]) 
     flash.notice = "Article '#{@article.title}' Updated!" 
     redirect_to article_path(@article) 
    end 
end 

型号:article.rb

class Article < ActiveRecord::Base 
    attr_accessible :title, :body 
    has_many :comments 
    belongs_to :user 
end 

user.rb

class User < ActiveRecord::Base 
    has_many :articles 
    has_many :comments 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :username, :email, :password, :password_confirmation, :remember_me 
    attr_accessible :title, :body 
end 

用户表

create_table "users", :force => true do |t| 
    t.string "email",     :default => "", :null => false 
    t.string "encrypted_password",  :default => "", :null => false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   :default => 0 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.boolean "is_admin" 
    t.boolean "is_active" 
    t.datetime "created_at",        :null => false 
    t.datetime "updated_at",        :null => false 
    t.string "username" 
    end 

回答

1

https://github.com/plataformatec/devise/wiki/How-To:-Add-an-Admin-role

如果页面可能不会设置一个CURRENT_USER然后:你的情况

if current_user.try(:admin?) 
    # do something 
end 

也许

if current_user.try(:is_admin) 
    # do something 
end 

这应该工作,当没有当前用户时(即。未登录)

+0

喜烤饼,它为我,非常非常感谢,今天你救了我:)但我无法理解为什么它的工作,而不是current_user.is_admin。你能解释一下吗? – 2013-04-04 19:45:39

+0

正如我所提到的那样,用户可能没有登录。try函数只检查它的剩余对象是否为零,否则将调用括号中的函数,否则不会。 – scones 2013-04-04 19:47:34

+0

现在明白了。 btw谢谢。 – 2013-04-04 19:49:51

0

请问您的用户模型有一个admin属性?

如果没有土特产品需要定义一个,例如

class AddAdminToUsers < ActiveRecord::Migration 
    def self.up 
    add_column :users, :admin, :boolean, :default => false 
    end 

def self.down 
    remove_column :users, :admin 
end 
end 

然后运行耙分贝:迁移

然后,您应该能够检查如果用户是管理员通过调用:

current_user.admin? 

还有其他选项可以在设计中做到这一点,请点击此处查看

https://github.com/plataformatec/devise/wiki/How-To:-Add-an-Admin-role

+0

hi ply,yes用户表的列is_admin是布尔值。我试图“current_user.is_admin”,但它拒绝current_user的实例。 – 2013-04-04 19:30:20

+0

does current_user.admin?为你工作? – ply 2013-04-04 19:32:35

+0

大家好,用户表已经有is_admin列,我用在其他页面,如<%@ users.each do | user | %> \t \t \t <%如果!user.is_admin%> \t \t​​<(%)=用户。电子邮件%> \t \t​​<%= user.created_at%> \t \t​​<(%)=用户。 sign_in_count%> \t \t​​ \t \t <% end %> \t – 2013-04-04 19:38:44

相关问题