Rails辅助方法与外部类

时间:2013-08-08 15:12:54

标签: ruby-on-rails

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

这是卡车的旧(工作)控制器。它的作用是按列和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,这样当没有参数传递页面时,它有一个默认值可以恢复,下面的排序方法是导致默认行为的方法。所有这些都按预期工作,我可以加载页面并进行排序。

现在,@ truck正在调用lib中的一个类,它与sort_methods具有相同的方法,因为我多次调用这些方法,而我正在尝试干这个代码。这样做仍然是因为我以这种方式完成了课程:

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>

我的假设是我传递的变量之一是零,我无法弄清楚哪一个以及如何避免这个问题?如果没有设置参数,是否有另一种方法可以默认为此。我也试过在索引中移动帮助器,但这给了我这个错误:

undefined method `sort_column' for :SortMethods:Symbol

1 个答案:

答案 0 :(得分:2)

Helper_method使得给定方法可以在控制器视图中访问。因此,您不需要将这些SortMethods方法指定为帮助程序,因为它们不是控制器的一部分。你应该可以在像

这样的视图中调用它们
SortMethods.sort_column(blah)

另外,你在哪里定义SortMethods类?如果它位于app文件夹中的任何位置的sort_methods.rb文件中,您可以跳过顶部的require,因为rails会自动搜索它(它是constant_missing方法的一部分)