1

これをできる限り最善の方法で説明しようと思います...だから、ここに行きます...

これが私の古い(動作中の)トラック用コントローラーです。それが行うことは、意図したとおりに機能する列と昇順/降順でソートすることです。

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
4

1 に答える 1

2

Helper_method は、指定されたメソッドをコントローラー ビュー内でアクセスできるようにします。したがって、これらの SortMethods メソッドはコントローラーの一部ではないため、ヘルパーとして指定する必要はありません。次のようなビューでそれらを呼び出すことができるはずです

SortMethods.sort_column(blah)

また、SortMethods クラスの定義はどこに保管していますか? app フォルダー内の任意の場所にあるファイル sort_methods.rb にある場合は、Rails が自動的に検索するため、上部の require をスキップできます (constant_missing メソッドの一部です)。

于 2013-08-08T15:26:26.543 に答える