加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Rails 4中定义模型/类中的自定义方法

发布时间:2020-12-17 04:02:20 所属栏目:百科 来源:网络整理
导读:我有以下型号: 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
我有以下型号:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读