Как запустить действие создания другого контроллера

Я работаю над бэкэндом приложения для iphone с рельсами. Это мой первый настоящий проект с рельсами.

Это приложение является своего рода приложением для управления проектами. В приложении люди могут создать учетную запись пользователя и в то же время они могут выбрать создание первого проекта. Поэтому, когда пользователи отправляют свою информацию, мой контроллер пользователей получает почтовый запрос с параметрами, содержащими как информацию о пользователе, так и информацию о проекте.

Итак, что я делаю сейчас, так это сохраняю информацию о пользователе со всеми атрибутами внутри базы данных, но я также проверяю, содержат ли параметры какую-либо информацию о проекте, и если это так, я хочу запустить действие создания контроллера проекта.

Я знаю, что это можно сделать, запустив два отдельных почтовых запроса или создав ассоциации между моделью пользователя и моделью проекта, а затем просто запустив Project.create из пользовательского контроллера, но поскольку я думаю, что этот способ по существу дублирует то, что должно создавать действие проекта в любом случае, я вместо этого хочу остаться сухим и просто каким-то образом запустить действие создания контроллера проектов.

Возможно ли это в рельсах? По крайней мере, это возможно с php и zend.


person Jason Blade    schedule 06.12.2011    source источник


Ответы (3)


Если у вас есть код, который должен быть разделен между контроллерами, вы, вероятно, захотите извлечь его в модуль и «подмешать» в качестве включения.

module SkyBlue
  def make_blue
   @my_colour = "blue"
  end
end

class Foo
  include SkyBlue

  def initialize
    @my_colour = "Foo coloured"
  end

  def my_colour
    @my_colour
  end
end

class Bar
  include SkyBlue

  def initialize
    @my_colour = "Bar coloured"
  end

  def my_colour
    @my_colour
  end
end

Затем вы можете увидеть эффект «смешанного» модуля:

f = Foo.new
f.my_colour # => "Foo coloured"
f.make_blue
f.my_colour # => "blue"

b = Bar.new
b.my_colour # => "Bar coloured"
b.make_blue
b.my_colour # => "blue"
person Pavling    schedule 06.12.2011

Вы не должны этого делать.

Тощий контроллер означает, что код действий контроллера должен быть небольшим.

Использование различных действий контроллера возможно и действительно может уменьшить размер кода конкретного действия, но есть компромисс. Вы увеличиваете сцепление. Вы делаете код действия зависимым от другого контроллера.

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

Просто абстрагируйте вспомогательный метод от того, что имеет смысл абстрагировать.

person Nerian    schedule 06.12.2011

Просто попробуйте вызвать его через ControllerName.new(env).create и посмотрите, что произойдет ;-)

person Reactormonk    schedule 06.12.2011