我似乎无法弄清楚为什么这不起作用。
我在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但它仍然不起作用。
答案 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散列作为参数传递你需要的任何东西,然后在函数内部使用它们作为参数通常