1

我的控制器中有以下方法:

def create
  p_attr=params[:upload]
  p_attr[:upload] = params[:upload][:upload].first if params[:upload][:arraydb].class == Array
  @upload = Upload.new(p_attr)

  respond_to do |format|
    if @upload.save
      @arraydb.process_name
    end
  end 
end

在模型中,我有另一种方法可以处理刚刚保存的上传:

def self.process_name 
  update_attributes(:user_id => current_user.id)
  update_attributes(:defined => "no")
end

它给了我一个错误,该方法process_name未定义Upload

有什么问题,如何从控制器更新模型中刚刚保存的文件的属性?提前致谢。

4

2 回答 2

7

在 Ruby 中,self.在名称前定义的方法是类方法。这意味着您只能在类本身上调用此类方法,而不能在其实例上调用。

这意味着:

upload = Upload.new()
upload.process_name

导致错误

尽管:

Upload.process_name

将调用该方法。

由于您真正想要做的是调用类process_name的实例,因此Upload您可以通过从方法定义中删除来更正代码self.,从而导致:

def process_name
    update_attributes(:user_id => current_user.id)
    update_attributes(:defined => "no")
end
于 2013-03-15T23:48:33.270 回答
2

它不是为class定义的,而不是为实例定义的。

您正在尝试在实例上调用它。使其成为实例方法。

于 2013-03-15T23:37:49.833 回答