Расширение контроллера в Rails
У меня есть контроллер, который вызывает другой класс.
class BlahController < ActionController
def index
OtherClass.get_stuff
end
end
В этом классе я хочу иметь возможность писать код стиля контроллера.
например:
class OtherClass
def self.get_stuff
@foo = bar
end
end
Тем не менее, я также хотел бы @foo
существовать в моем представлении, но, поскольку это отдельный класс, эти переменные не возвращаются обратно в присваивания контроллера - поэтому вопрос в том, как я могу сделать это так?
(Проигнорируйте, почему я должен вызывать отдельный класс, я пытаюсь привести этот код в соответствие с унаследованной кодовой базой без слишком большого количества бойни)
2 ответа
class BlahController < ActionController
def index
OtherClass.get_stuff(self)
end
end
class OtherClass
def self.get_stuff(that)
that.instance_variable_set(:@foo, bar)
end
end
Обратите внимание, что я не согласен с этим методом. Я просто отвечаю на вопрос, как вы это сформулировали.
Я бы предпочел выполнить эту функцию через миксины и тем самым уменьшить связывание параметров, присутствующее в коде выше.
Такой структурированный код будет трудно читать и поддерживать. Всякий раз, когда вы можете, позвольте контроллеру напрямую установить все переменные, которые нужны представлению:
class BlahController < ActionController
def index
@foo = OtherClass.get_stuff
end
end
class OtherClass
def self.get_stuff
# return the value that should be assigned to @foo
end
end