0

なぜこれがうまくいかないのか理解できないようです。

私はこのコードで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

私の trucks_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

私が理解していないのは、私が間違っていることです。この投稿で提案されていることはすべて試しましたが、別の人が同じ質問をしましたが、うまくいきません。私は何を間違っていますか?

post: Rails - lib ディレクトリからメソッドを呼び出すには?

私も .self を追加しようとしたことを追加する必要がありますが、それでも機能しません。

4

2 に答える 2

1

あなたのエラーを見てください。 undefined local variable or method 'params' for #<SortMethods:0x2224008>

これは、SortMethodsが を呼び出そうとしていることを意味しますparams[]

paramsオブジェクト にアクセスできるのはコントローラーだけです。

SortMethods クラスで、paramsオブジェクトを呼び出していないことを確認してください。Web からのパラメーターが必要な場合は、メソッドの 1 つに引数として渡します。このようなものが機能します。

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、必要なものだけを取得する必要があるため、それは望ましくありません。

于 2013-08-08T13:16:42.723 に答える
1

問題は、クラスを適切にインポートしていないことではありません。エラーのこの部分を見てください。

#<SortMethods:0x2224008>

これは、SortMethods のインスタンスを表します。つまり、適切にインポートされ、インスタンス化されていることを意味します。エラーが示しているのは、SortMethods クラスに params という属性またはメソッドがないことです。つまり、SortMethods内で定義された 2 つのメソッドのコード内のどこかで、アクセスできないコントローラー プロパティであるparams を使用しようとしています。それ以外の場所 (ビューを除く)。

編集: params ハッシュにあるものにアクセスする必要がある場合は、引数を取るようにメソッドを変更し、必要なものを params ハッシュからパラメーターとして渡して呼び出し、通常どおり関数内でそれらを使用する必要があります。

于 2013-08-08T13:20:51.960 に答える