1

我将尝试以最好的方式解释这一点......所以我们开始......

这是我的旧(工作)卡车控制器。它的作用是按列和按预期工作的 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
4

1 回答 1

2

Helper_method makes given method accessible inside controller views. Hence, you don't need to specify those SortMethods methods as a helper, because they are not part of the controller. You should be able to call them in a view like

SortMethods.sort_column(blah)

Also, where do you keep definition of SortMethods class? If it is in a file sort_methods.rb anywhere in app folder, you can skip require on the top, as rails will automatically search for it (it is a part of constant_missing method)

于 2013-08-08T15:26:26.543 回答