我的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....
方法。有一些显而易见的东西让我失踪了。救命啊!
答案 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