Как запустить действие создания другого контроллера - PullRequest
1 голос
/ 06 декабря 2011

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 06 декабря 2011

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

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"
0 голосов
/ 06 декабря 2011

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

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

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

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

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

0 голосов
/ 06 декабря 2011

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

...