在控制器

时间:2017-03-23 04:40:41

标签: ruby-on-rails ruby

我的Rails已经变得相当生疏,我正在疯狂地试图弄清楚可能是那么基本的东西,我看不到森林里的树木。

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

equip_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

型号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

带有所需方法的工具模型

def transfer_equipment(location,ids)
  ids.each do |id|
    Tool.find(id).update(location: location)
  end
end

我认为调用类方法会允许它在EquipSwap实例@equip_swap的实例上执行该方法。当我尝试提交表单并创建新记录时,它告诉我trans_equip_and_save没有Class....方法。有一些显而易见的东西让我失踪了。救命啊!

2 个答案:

答案 0 :(得分:4)

方法以self调用类方法开头,并且没有self调用实例方法,让我举个例子

Class method
def self.class_method
  # do some stuff
end

Instance method
def instance_method
  # do some stuff 
en

使用

调用类方法
ModelName.class_method

使用

调用实例方法
@instance_variable.instance_method

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

def trans_equip_and_save
 EquipSwap.transaction do
  Tool.transfer_equipment(self.to_vehicle, self.items_moved)
  self.save
 end
end

现在使用实例变量@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

答案 1 :(得分:2)

这里有两点需要注意,

首先,有两种不同的方法, class methods instance methods

类方法:类方法直接在类上定义,并使用def self.method定义。

用法:Class.method

实例方法:实例方法是在object的{​​{1}}上定义的,并且定义为没有自我

用法:class

因此,在您的情况下,将有两个更改,

1)你打电话给object = Class.new(), def method ==> object.method

因为,@equip_swap.trans_equip_and_save是一个对象,根据第二点,你知道有一个,因为@equip_swap是一个对象,根据第二点,你强调有一个没有自我的实例方法。 /强>

@equip_swap

2)def trans_equip_and_save EquipSwap.transaction do Tool.transfer_equipment(self.to_vehicle, self.items_moved) self.save end end ,使用Tool.transfer_equipment进行调用。因此,根据第一点,应该用self 调用。

class name