Расширение контроллера в 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
Другие вопросы по тегам