我将尝试以最好的方式解释这一点......所以我们开始......
这是我的旧(工作)卡车控制器。它的作用是按列和按预期工作的 asc/desc 顺序排序。
class TrucksController < ApplicationController
# GET /trucks
# GET /trucks.json
require 'sort_methods'
helper_method :sort_column, :sort_direction
def index
@trucks = Truck.search(params[:search]).order(SortMethods.sort_column(Truck, "truck_no", params[:sort]) + " " + SortMethods.sort_direction(params[:direction]))
respond_to do |format|
format.html # index.html.erb
format.json { render json: @trucks }
end
end
private
def sort_column
Truck.column_names.include?(params[:sort]) ? params[:sort] : "truck_no"
end
def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : "asc"
end
end
据我了解,此处调用了 helper_method,以便在不带参数传递页面时,它具有可以恢复的默认值,并且下面的排序方法是导致默认行为的方法。所有这些都按预期工作,我可以加载页面和排序。
现在@卡车正在调用 lib 中的一个类,该类与我的 sort_methods 具有相同的方法,因为我多次调用这些方法并且我正在尝试对它进行 DRY 编码。这行得通,仍然是因为我以这种方式完成了课程:
class SortMethods
def self.sort_column(table, field, sort)
table.column_names.include?(sort) ? sort : field
end
def self.sort_direction(direction)
%w[asc desc].include?(direction) ? direction : "asc"
end
end
好吧,这样的代码可以按预期工作,问题是我在控制器和 SortMethods 类中重复了两次排序方法。我想做的是使用 SortMethods 为帮助程序类设置默认值,但是如果我尝试使用以下代码调用它:
helper_method :SortMethods.sort_column(Truck, "truck_no", params[:sort]), SortMethods.sort_direction(params[:direction])
我收到以下消息:
undefined local variable or method `sort_column' for #<#<Class:0x1a3a780>:0x1852f08>
我的假设是我传入的变量之一是 nil,我不知道是哪一个以及如何避免这个问题?如果没有设置任何参数,是否有另一种方法可以默认使用。我也尝试在索引中移动助手,但这给了我这个错误:
undefined method `sort_column' for :SortMethods:Symbol