Rails传递给类后的活动记录为null

时间:2017-06-05 13:29:08

标签: ruby ruby-on-rails-5 helper

我希望能够将我的用户对象传递给另一个类进行验证。基本上我做的事情就像

我的控制器:

def new

  user = User.find(1)
  logger.info "#{user.id}, #{user.name}, #{user.isadmin}"
  #The above is logged with 1, test, true
  uhelper = UserHelper.new(user)
  if !uhelper.isAdmin
    #Only admins can access this page
    redirect_to root_path
  end

end
app / models 中的

Class UserHelper

def initialize(user)
  @user = user
end

def isAdmin
  if @user.isadmin
    true
  end
    nil
end

即使我知道记录是正确的,控制器中的if语句总是解析为nil。我是否可以不将ActiveRecords传递给正确的类?

有没有人有任何想法可能会发生这种情况?

修改

undefined method `isadmin' for nil:NilClass
app/models/userfnc.rb:14:in `isAdmin'
app/controllers/rosters_controller.rb:12:in `index'

sqlite> select * from users;
1|testuser|test@test.com|20170601|20170601|1

sqlite> .schema users
CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar DEFAULT NULL, "email" varchar DEFAULT NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "isadmin" boolean);

1 个答案:

答案 0 :(得分:1)

您可以对代码使用相当多的代码改进。

关于你的问题,你的外壳可能会让你。检查你的桌子。您的字段可能被称为isadmin而不是isAdmin

至于您的代码改进,这里有什么可以帮助您:

def isAdmin
  if @user.isAdmin
    true
  end
    nil
end

你可以用一行完成这个:

def isAdmin
  @user.isAdmin
end

这一点,

uhelper = UserHelper.new(user)
if !uhelper.isAdmin
  #Only admins can access this page
  redirect_to root_path
end

如果你有一个这样的简单表达式,有时候也可以更容易地将它减少到一行:

uhelper = UserHelper.new(user)
redirect_to root_path unless uhelper.isAdmin

然而...... Rails标准是在这种情况下使用过滤器。而不是那个位,把它放在一个过滤方法中。

class MyController
  before_filter :check_admin
  ...
  ...
  private
  def check_admin
    redirect_to root_path unless user.isAdmin
  end
end