我的创建操作中有以下代码。 的 tasks_comtroller.rb
def create
@task = current_user.tasks.build(task_params)
@task.complete = false
n=1
loop do
unless Task.find_by priority: n
@task.priority=n
break
end
n+=1
end
respond_to do |format|
if @task.save
format.html { redirect_to user_tasks_path(current_user) }
format.js
else
format.html { render action: 'new' }
format.js
end
end
end
然后我拿出了一些部分,我在我的任务模型中创建了一个方法。
class Task < ActiveRecord::Base
def priority_increment
n=1
loop do
unless Task.find_by priority: n
@task.priority=n
break
end
n+=1
end
end
end
我现在如何从控制器正确调用此方法?
答案 0 :(得分:1)
如果要将该部分代码放入模型中,则必须调用self
而不是实例变量@task
,如下所示:
class Task < ActiveRecord::Base
def priority_increment
n=1
loop do
unless Task.find_by priority: n
self.priority=n
break
end
n+=1
end
end
end
之后你可以在任务实例上调用它:
@task.priority_increment
答案 1 :(得分:1)
这非常低效,因为每次迭代都必须进行数据库查询 - 而是执行class Task < ActiveRecord::Base
def self.heighest_priority
# .try lets us handle the case where there
# are no Tasks gracefully
p = Task.order(:priority).first.try(:priority)
# return the highest + 1 or 1 if there are no tasks.
p ? p + 1 : 1
end
end
并让数据库完成工作。
obj.some_method # in Ruby the parens are optional
obj.some_method(someArg)
obj.some_method(someArg) do
# blocks are awesome.
end
无论你在哪里调用函数,都要在ruby中调用完全相同的方法:
Task.heighest_priority
这里我们有一个类方法 - 我们称之为def create
@task = current_user.tasks.build(task_params) do |t|
t.priority = Task.heighest_priority
t.complete = false
end
if @task.save
format.html { redirect_to user_tasks_path(current_user) }
format.js
else
format.html { render action: 'new' }
format.js
end
end
。
因此,让我们重构create方法以使用我们的新方法:
<img src="<?php echo HTTP_IMAGES_PATH; ?>roof.png" class="img-responsive" id="roof" />
<button onclick="changeID('roof_red')">RED</button>