0

我似乎无法弄清楚为什么这不起作用。

我在 lib 中有一个带有以下代码的类:

    class SortMethods
  def initialize(direction, sort)
    @mydirection = direction
    @mysort = sort
  end
  def sort_column(table, field)
    table.column_names.include?(@mysort) ? @mysort : field
  end

  def sort_direction
    %w[asc desc].include?(@mydirection) ? @mydirection : "asc"
  end
end

在我的卡车控制器中,我有以下代码:

    class TrucksController < ApplicationController
  # GET /trucks
  # GET /trucks.json
  require 'sort_methods'
  helper_method :sort_column, :sort_direction
  def index
    search = params[:search]
    msm = SortMethods.new(params[:direction], params[:sort])
    @trucks = Truck.search(search).order(msm.sort_column(Truck, "truck_no") + " " + msm.sort_direction)

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @trucks }
    end
  end
end

我不明白我做错了什么,我已经尝试了这篇文章中建议的所有内容,另一个人有同样的问题,但它不起作用。我究竟做错了什么?

帖子:Rails - 如何从 lib 目录调用方法?

我应该补充一点,我也尝试添加 .self ,但它仍然不起作用。

4

2 回答 2

1

看看你的错误。 undefined local variable or method 'params' for #<SortMethods:0x2224008>

这意味着SortMethods正在尝试调用params[].

只有控制器可以访问该params对象。

在您的 SortMethods 类中,确保您没有调用该params对象。如果您需要来自网络的参数,请将其作为参数传递给您的方法之一。像这样的东西会起作用。

class SortMethods
  def initialize(param)
    @param = param
  end

  def sort_column(table, field)
    puts @param
  end

  def sort_direction
    #some action
  end
end

然后在你的控制器中,

def index
  msm = SortMethods.new(params[:something])
  ...
end

从概念上讲,您可以传递整个params对象,但您不希望这样做,因为您应该只取您需要的东西。

于 2013-08-08T13:16:42.723 回答
1

问题不在于它没有正确导入类。看这部分错误:

#<SortMethods:0x2224008>

这表示 SortMethods 的一个实例,这意味着它已被正确导入和实例化。错误告诉您的是 SortMethods 类没有称为 params 的属性或方法,这意味着您尝试在 SortMethods 中定义的这两个方法的代码内部某处使用 params,这是一个不可访问的控制器属性其他任何地方(视图中除外)。

编辑:如果您需要访问 params 哈希中的某些内容,您必须修改您的方法以获取参数,然后调用它们,从 params 哈希中传递您需要的任何内容作为参数,然后像往常一样在函数中使用它们。

于 2013-08-08T13:20:51.960 回答