如何在控制器中调用方法?

时间:2015-08-03 21:07:04

标签: ruby-on-rails ruby-on-rails-4

我的创建操作中有以下代码。 的 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

我现在如何从控制器正确调用此方法?

2 个答案:

答案 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>