用户模型中丢失的方法,Rails 4.1

时间:2015-06-25 19:21:22

标签: ruby ruby-on-rails-4 model

这应该很容易,但我显然遗漏了一些东西。完成测试练习,并尝试在User模型上创建方法。看起来它应该非常简单,但每当我尝试访问该方法时,Rails都会丢失方法。

这是文件app / models / user.rb的代码:

class User < ActiveRecord::Base
  has_secure_password

  validates :email, presence: true, uniqueness: true

  def administrator?
  end
end

此时我正在完成TDD流程,并且只是尝试通过创建方法来满足测试异常(我稍后会为管理员添加代码?方法)。这是规范中的一行:

    expect(admin.administrator?).to be_true

测试的输出:

1) User management adds a new user
 Failure/Error: expect(admin.administrator?).to be_true
   expected  to respond to `true?`

然而,我似乎无法访问这个怪胎方法!每当我打电话给#administrator?我得到的User类对象的方法:

NoMethodError: undefined method `administrator?' for #<User:0x007f9ac6929358>

这里是对&-M&#39;当我在User类中时,显示可用的方法:

User#methods: administrator  password  password_confirmation

这里是pry控制台会话的输出:

[73] pry(User):1> admin = User.first
User Load (0.2ms)  SELECT  "users".* FROM "users"   ORDER BY "users"."id" ASC LIMIT 1
=> #<User id: 1, email: "test@yahoo.com", password_digest: "secret123", created_at: "2015-06-25 17:33:25", updated_at: "2015-06-25 17:33:25", admin: true, firstname: nil, lastname: nil>
[74] pry(User):1> admin.valid?
User Exists (0.2ms)  SELECT  1 AS one FROM "users"  WHERE ("users"."email" = 'test@yahoo.com' AND "users"."id" != 1) LIMIT 1
=> true
[75] pry(User):1> admin.instance_of?(User)
=> true
[76] pry(User):1> admin.administrator?
NoMethodError: undefined method `administrator?' for #<User:0x007f9ac6929358>
from /Users/me/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/activemodel-4.1.1/lib/active_model/attribute_methods.rb:435:in `method_missing'

我也尝试将该方法定义为self.administrator,结果相同。我回过头来看看Rails教程中定义的模型方法,我无法看到有关Hartl模型的任何信息,这有助于我理解为什么我的方法不起作用。

任何帮助将不胜感激!我似乎错过了一些基本的东西......

****编辑/更新**** 在得到关于如何从用户对象返回boolean:admin列的响应后,我意识到值得澄清真正的问题。我试图理解的真正问题不是administrator?方法是否是确定给定用户是否是管理员的最佳方法(正如@sajinmp非常有用地指出,对象由于数据库中的相应列,它将响应admin?

我真正的疑问/挫折是为什么我无法让对象响应模型中创建的那个或任何其他方法。

2 个答案:

答案 0 :(得分:1)

如果您在方法中所做的只是检查用户是否是管理员,则不需要这样的特定方法。因为在您的用户模型中管理员由管理员代表只调用admin?就够了。

current_user.admin (<admin.admin> in this case) 

将接听您的电话。但是当admin为零时,这将是一个问题,因此最好使用

admin.try(:admin)

即使admin为零,也不会抛出错误。

答案 1 :(得分:0)

我重新启动了Rails服务器,这似乎解决了它。在循环服务器并启动新的控制台会话之后,用户对象现在响应user.rb中的方法。

应该早点完成(DUH!),但我认为没有必要。在控制台会话中,我可以使用reload!,然后Pry show-source方法将确认方法是在写入的控制台中出现的。我不认为控制台依赖于服务器,但我一定是错的..?

感谢对此的任何确认。