これをできる限り最善の方法で説明しようと思います...だから、ここに行きます...
これが私の古い(動作中の)トラック用コントローラーです。それが行うことは、意図したとおりに機能する列と昇順/降順でソートすることです。
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 が呼び出されるため、ページが引数なしで渡されると、元に戻すことができるデフォルトがあり、以下のソートメソッドはデフォルトの動作を引き起こすメソッドです。これはすべて意図したとおりに機能し、ページを読み込んで並べ替えることができます。
現在、@ トラックは、sort_methods と同じメソッドを持つ lib のクラスを呼び出しています。これは、これらのメソッドを複数回呼び出して、これを 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 クラスで、並べ替えメソッドを 2 回繰り返していることです。私がやりたいことは、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>
私の仮定は、私が渡している変数の 1 つが nil であるということです。どれがどれかわかりません。この問題を回避するにはどうすればよいでしょうか? パラメータが設定されていない場合、これをデフォルトにする別の方法はありますか。また、ヘルパーをインデックスに移動しようとしましたが、次のエラーが発生します。
undefined method `sort_column' for :SortMethods:Symbol