我正在使用RSpec和FactoryGirl来测试我的模型而且我坚持使用“high_priority”方法,这是RSpec因某些原因无法看到的。
这是方法本身:
模型/ task.rb
class Task < ActiveRecord::Base
#some stuff
def self.highest_priority
p = Task.order(:priority).last.try(:priority)
p ? p + 1 : 1
end
end
当我运行 task_spec.rb
时require 'spec_helper'
describe Task do
it "returns highest priority" do
last_task = FactoryGirl.build(:task, priority: "5")
last_task.highest_priority
expect(last_task(:priority)).to eq("6")
end
end
当我在我的控制器中调用此方法时,就像这样
def create
@task = current_user.tasks.build(task_params)
@task.highest_priority
@task.complete = false
respond_to do |format|
if @task.save
format.js
else
format.js
end
end
end
方法看起来像
def highest_priority
self.maximum(:priority).to_i + 1
end
我正在
答案 0 :(得分:1)
您需要将方法创建为Task
模型的实例方法。如下所示:
class Task < ActiveRecord::Base
#some stuff
def highest_priority
p = Task.order(:priority).last.try(:priority)
p ? p + 1 : 1
end
end
答案 1 :(得分:1)
首先,您最好使用ActiveRecord&#39; maximum
而不是订购然后选择一个,您将避免实例初始化并直接从查询中获取数字
Task.maximum(:priority)
这可以放在像这样的类方法中
def self.maximum_priority
Task.maximum(:priority) || 0 # fall back to zero if no maximum exists
end
然后对于正在更新方法的后半部分,我将为其创建一个实例方法,并使用类方法
def set_maximum_priority
self.priority = self.class.maximum_priority + 1
self
end
请注意,我最后为了可链接性而返回了自己
然后你的行动会变成这样的
def create
@task = current_user.tasks.build(task_params).set_maximum_priority
@task.complete = false
...
end