1

我的 Rails 项目中有一个名为“活动”的控制器,其中包含此模块“可排序”:

控制器:

class ActivitiesController < ApplicationController

  include Sortable
  ...

模块(工作):

module Sortable
  def save_positions
    @ids = params[:ids]
    # ~ Converting to array separating by ',' 
    @ids = @ids.split(",")

    count = 0
    # ~ Saving new positions
    for i in @ids
      Activity.update(i, {:position => count})
      count += 1
    end

    render :json => :success
  end
end

但是当我重构代码时,我可以与其他控制器一起使用:

已编辑

require 'active_support/concern'

module Sortable
  extend ActiveSupport::Concern

  module InstanceMethods
    def save_positions
      @ids = params[:ids]
      # ~ Converting to array separating by ',' 
      @ids = @ids.split(",")

      count = 0
      # ~ Saving new positions
      for i in @ids
        update(i, {:position => count})
        count += 1
      end

      render :json => :success
    end
  end
end

我做错了什么?

新错误消息:

ArgumentError (wrong number of arguments (2 for 0)): app/controllers/activities_controller.rb:61:in 

我从以下位置删除了“活动”:

Activity.update(i, {:position => count}) 
4

1 回答 1

2

控制器动作被实现为控制器上的实例方法,而不是类方法。从我所见,除了您定义save_positions为类方法而不是实例方法这一事实之外,您已将所有内容设置得非常好。

require 'active_support/concern'

module Sortable
  extend ActiveSupport::Concern

  module InstanceMethods ## <== just changed this
    def save_positions
      ...
    end
  end
end

更新以回答问题的下一部分:

您正在尝试从共享控制器操作调用模型上的方法。您无法提前知道该模型是什么。如果你真的想让你的代码在控制器而不是模型中共享,我们可以在运行时找出模型并让事情正常工作

共同save_positions行动:

def save_positions
  @ids = params[:ids]
  # ~ Converting to array separating by ',' 
  @ids = @ids.split(",")

  count = 0
  # ~ Saving new positions
  for i in @ids
    AR_CLASS.update(i, {:position => count})
    count += 1
  end

  render :json => :success
end

一些随机控制器:

class ActivitiesController < ApplicationController
  include Sortable
  AR_CLASS = Activity
  # ....
end

class FoosController < ApplicationController
  include Sortable
  AR_CLASS = Foo
  # ....
end

然后,您的save_postition操作将update根据运行的控制器调用正确的模型。

于 2012-08-09T01:42:26.787 回答