在控制器中调用的 Rails 方法中的类的未定义方法错误

Bea*_*ech 2 ruby ruby-on-rails

我的 Rails 已经生锈了,我快把自己逼疯了,试图找出一些可能是如此基本的东西,以至于我看不到树木的森林。

我有一个表单,用于create我的控制器的操作。当我保存时,我还需要更新另一个表中的一些项目。我想把它全部包装在一个交易中。我认为首选是将交易放入模型中。当我这样做并尝试调用该create操作时,它会出错,告诉我该类没有方法。

Equipment_swaps_controller.rb

 def create
   respond_to do |format|
     @equip_swap = EquipSwap.new(equip_swap_params)
     if @equip_swap.trans_equip_and_save
       format.html { redirect_to @equip_swap, notice: 'Equipment transfer was successfully created.' }
     else
       format.html { render action: 'failure' }
     end
   end
 end
Run Code Online (Sandbox Code Playgroud)

模型equip_swap.rb

def self.trans_equip_and_save
  EquipSwap.transaction do
    Tool.transfer_equipment(self.to_vehicle, self.items_moved)
    self.save
  end
end
Run Code Online (Sandbox Code Playgroud)

具有所需方法的工具模型

def transfer_equipment(location,ids)
  ids.each do |id|
    Tool.find(id).update(location: location)
  end
end
Run Code Online (Sandbox Code Playgroud)

我想调用类的方法将允许它来执行我的的实例方法EquipSwap的实例@equip_swap。当我尝试提交表单,并创建它告诉我,有没有新的记录trans_equip_and_save的方法Class....。有一些明显的东西我错过了。帮助!

ash*_*vin 5

方法从self它的调用类方法开始,没有self它的调用实例方法,让我举个例子

Class method
def self.class_method
  # do some stuff
end

Instance method
def instance_method
  # do some stuff 
en
Run Code Online (Sandbox Code Playgroud)

调用类方法使用

ModelName.class_method
Run Code Online (Sandbox Code Playgroud)

调用实例方法使用

@instance_variable.instance_method
Run Code Online (Sandbox Code Playgroud)

在您的代码中,将您的方法更改为实例方法

def trans_equip_and_save
 EquipSwap.transaction do
  Tool.transfer_equipment(self.to_vehicle, self.items_moved)
  self.save
 end
end
Run Code Online (Sandbox Code Playgroud)

现在使用实例变量调用这个方法 @equip_swap.trans_equip_and_save

编辑:

如果您使用模型名称调用 transfer_equipment 然后self在方法名称之前添加,我的意思是使其成为类方法,如下所示

def self.transfer_equipment(location,ids)
  ids.each do |id|
    Tool.find(id).update(location: location)
  end
end
Run Code Online (Sandbox Code Playgroud)