这应该很容易,但我显然遗漏了一些东西。完成测试练习,并尝试在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?
。
我真正的疑问/挫折是为什么我无法让对象响应模型中创建的那个或任何其他方法。
答案 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
方法将确认方法是在写入的控制台中出现的。我不认为控制台依赖于服务器,但我一定是错的..?
感谢对此的任何确认。