ruby-on-rails – 在Rails 4中定义模型/类中的自定义方法
我有以下型号:
class ActivityLog < ActiveRecord::Base validates :user_id,:instance_id,:action,presence: true validates :user_id,numericality: true def log ActivityLog.create( user_id: current_user ? current_user.id : -1,instance_id: instance_id,action: actions.index(action) ) end private def actions ['start','stop','create','destroy'] end end 当我从rails控制台调用以下行时,出现错误: ActivityLog.log(user_id: 1,instance_id:1,action: 'create') # Error returned from console NoMethodError: undefined method `log' for #<Class:0x007fb4755a26a8> 为什么我的方法调用不起作用?我在课堂上定义了它,但它说它是未定义的.我错过了什么或误解了什么?谢谢. 解决方法
创建方法日志
假设您有一个类User,并且在类中定义方法has_cell_phone. (该方法的内容无关紧要.)当您将类中的方法定义为def has_cell_phone时,可以在任何User对象上调用该方法.虽然类User本身就是一个类对象,但您可以在其直接类为User的对象上调用它.正确地说,您将为User类的实例编写实例方法. 您收到该错误,因为您定义的方法日志仅适用于ActivityLog类的_instance.如果执行以下操作,则可以根据当前代码正确调用日志: activity_log = ActivityLog.create # with required params activity_log.log 其次,您使用参数调用日志,而您的方法定义不需要任何参数. (这看起来像def log(params).) 现在,您可以在此处修改现有代码.如果要在整个类上调用方法(意味着类本身),则将关键字self添加到类方法定义中.例如,对于User类,它将是def self.create_user_with_cell_phone.您还可以向该方法添加参数.您在“方法调用”行中提供的参数,我会将它们添加到您的类方法中,如下所示: def self.log(instance_id,action) # ... end ActivityLog.log(1,'create') 您不需要包含user_id,因为根据您的逻辑,它会检查current_user对象是否为true,并从那里开始. 创建一个类常量 再看看你的问题,我发现你正在定义一个方法动作.还记得我对实例方法的看法吗?由于看起来行动总是保持不变,我建议你做一个!为此,建议您在任何方法定义之前在类中放置以下行. ACTIONS = ['start','destroy'] 然后,只要您想在ActivityLog类中调用ACTIONS,就可以执行以下操作:ACTIONS.index(action).如果你想在它的类之外调用这个常量,你可以这样做:ActivityLog :: ACTION.它与类方法调用的语法类似,而是使用::将类与常量分开.重新检查您的代码,现在应该如下所示: class ActivityLog < ActiveRecord::Base ACTIONS = ['start','destroy'] validates :user_id,numericality: true def self.log(instance_id,action) ActivityLog.create( user_id: (current_user ? current_user.id : -1),action: ACTIONS.index(action) ) end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |