2013-08-08 2 views
0

Я не могу понять, почему это не сработает.Метод класса импорта Rails из lib

У меня есть класс в 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 

То, что я не понимаю, это то, что я делаю неправильно, я «Пробовал все, что было предложено в этом посте, у другого человека был тот же вопрос, но он не работает. Что я делаю не так?

сообщение: Rails - how to call methods from lib directory?

Я хотел бы добавить, что я также пытался добавить .self и она по-прежнему не работает.

+0

, пожалуйста, отобразите код для sort_column. Вы пытаетесь получить доступ к хэшу params внутри него? – Doon

+0

По-видимому, вы вызываете 'params' в свой класс' SortMethods'. И вы не передаете его методам 'new' или' sort_column'. – MurifoX

+0

@MurifoX Я не совсем понимаю, что вы сказали, как бы исправить это, не могли бы вы случайно отправить ответ? Я новичок в рельсах, пытаясь узнать, как все это сделано правильно. – Bojan

ответ

1

Посмотрите на вашу ошибку. undefined local variable or method 'params' for #<SortMethods:0x2224008>

Это значит, что SortMethods пытается позвонить params[].

Только контроллеры могут иметь доступ к объекту params.

В вашем классе SortMethods убедитесь, что вы не вызываете объект params. Если вам нужен параметр из Интернета, передайте его в качестве аргумента одному из ваших методов. Что-то вроде этого будет работать.

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 объект, но вы не хотели бы потому, что вы должны принимать только то, что вам нужно.

+0

'Грузовик.поиск 'не проблема, это либо' sort_column', либо 'sort_direction' –

+0

Я пробовал ваш метод, и я получил ту же ошибку. Я редактировал мой код и дал вам все это. Существует также вспомогательный метод, но я не думаю, что вам это нужно, не так ли? – Bojan

+0

обновлено - может помочь – sircapsalot

1

Проблема не в том, что он не импортирует класс должным образом. Посмотрите на эту часть ошибки:

#<SortMethods:0x2224008> 

Это представляет собой экземпляр SortMethods, что означает, что он был импортирован и экземпляр должным образом. То, что вам говорит об ошибке, состоит в том, что класс SortMethods не имеет атрибута или метода, называемых параметрами, что означает, что где-то внутри кода этих двух методов, определенных внутри SortMethods, которые вы пытаетесь использовать params, который является свойством контроллеров, которое недоступны нигде (кроме представления).

Редактировать: Если вам нужно получить доступ к чему-либо, что находится в хэше params, вам необходимо изменить методы для принятия аргументов, а затем называть их передачей всех необходимых параметров хеша параметров в качестве параметров, а затем использовать их внутри функции как обычно.

+1

Я обновил свой код, чтобы показать все методы, из всего, что вы сказали, я считаю, что проблема была там, однако я еще не совсем понимаю, как ее исправить. – Bojan

+1

Это легко, я думаю, проблема в том, что вы исходите из php или другого процедурного языка. В рубине и по расширению на каждом объектно-ориентированном языке высокого уровня доступны не все переменные. params [] - хэш, определенный внутри контроллера. Если вы вызываете какой-либо другой объект из контроллера, этот другой объект (SortMethods в вашем случае) не имеет доступа к чему-либо из контроллера, включил hash. Только то, что вы передадите в качестве аргументов, будет. Точно так же, как вы передаете таблицу и поле в качестве аргументов, чтобы сделать их доступными для метода sort_colum, пропустите параметры тоже! – bluehallu

+0

Я родом из java и C#, а также asp.net и AJAX. Я сделал OOP и MVC с java, я получил общую концепцию, самая большая проблема, с которой я столкнулся с рельсами, - это понять, к чему я могу обратиться, я думаю, что если я смогу добиться этого, я бы хорошо справился с рубинами и рельсами. Спасибо за ваши объяснения. – Bojan

Смежные вопросы