Rails从lib导入类方法

时间:2013-08-08 13:01:56

标签: ruby-on-rails

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

我在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

在我的truck_controller中,我有这段代码:

    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 - how to call methods from lib directory?

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

2 个答案:

答案 0 :(得分:1)

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

这意味着SortMethods正试图致电params[]

只有控制器才能访问params对象。

在SortMethods类中,确保不要调用params对象。如果您需要Web中的参数,请将其作为参数传递给您的某个方法。这样的事情会起作用。

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对象,但你不会想要这样,因为你只应该拿走你需要的东西。

答案 1 :(得分:1)

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

#<SortMethods:0x2224008>

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

编辑:如果你需要访问params散列中的东西,你必须修改你的方法来获取参数,然后调用它们从params散列作为参数传递你需要的任何东西,然后在函数内部使用它们作为参数通常