Что корректный путь состоит в том, чтобы выполнить одно действие контроллера от другого действия контроллера без перенаправления HTTP?

printLine увеличивает переменную count, но это никогда не сбрасывается.

Так что однажды $count == 8, цикл until ничего не делает.

10
задан Scotty Allen 15 May 2009 в 18:17
поделиться

6 ответов

Вместо вызова кода между действиями извлеките код в lib / или что-то еще и вызовите этот код с обоих контроллеров.

# lib/foo.rb
module Foo
  def self.bar
  # ...
  end
end

# posts_controller
def index
  Foo.bar
end

# things_controller
def index
  Foo.bar
end
13
ответ дан 3 December 2019 в 18:00
поделиться

Создайте экземпляр класса контроллера:

@my_other_controller = MyOtherController.new

Затем вызовите на нем методы:

@my_other_controller.some_method(params[:id])

Я предпочитаю идею модуля, но это должно помочь.

9
ответ дан 3 December 2019 в 18:00
поделиться

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

http://weblog.jamisbuck.org/2006/10/ 18 / тощий-контроллер жира-модель http://www.robbyonrails.com/articles/2007/06/19/put-your-controllers-on-a-diet-already [тысяча двести пятьдесят-одна] HTTP: // andrzejonsoftware.blogspot.com/2008/07/mvc-how-to-write-controllers.html

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

0
ответ дан 3 December 2019 в 18:00
поделиться

Я подозреваю, что вам нужен вариант 3, но давайте сначала рассмотрим некоторые альтернативы

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

Вариант 2 - Вставьте логику обратно в вашу модель. Плюсы - держит контроллер в чистоте. Минусы - не работает, если у вас много сессий, параметров или взаимодействия рендеринга / перенаправления.

Вариант 3 - Оставайтесь в рамках одного контроллера. Я подозреваю, что вы пытаетесь заменить некоторые существующие функции некоторыми новыми, но только в некоторых случаях. Плюсы - Просто и получите доступ ко всему, что вам нужно. Минусы - работает только в том случае, если имеет смысл использовать один и тот же контроллер, т.е. вы работаете с одним и тем же объектом, таким как пользователь, место или компания.

Давайте посмотрим на пример варианта 3. Мой контроллер ссылок имеет совершенно другое поведение для админы, чем другие пользователи ...

class LinksController < ApplicationController
  #...

  def new
    #Check params and db values to make a choice here
    admin? ? new_admin : new_user
  end

  #...

private

  def new_admin
    #All of the good stuff - can use params, flash, etc 
    render :action => 'new_admin'    
  end

  def new_user
    #All of the good stuff - can use params, flash, etc 
    render :action => 'new_user' 
  end

end
1
ответ дан 3 December 2019 в 18:00
поделиться

Сделайте следующее:

class OldController < ApplicationController
  def old_controller_action
    if should_use_new_controller
      new_controller_action
    end
    # rest of old and busted
  end
end

и новый контроллер

class NewController < OldController
  def new_controller_action
    # new hotness
  end
end
-1
ответ дан 3 December 2019 в 18:00
поделиться

If extracting the common code between controllers into a module doesn't work for you, I would use Rack middleware. I haven't seen code that uses ActiveRecord within middleware but I don't know of any reason why it shouldn't be possible since people have used Redis and the like.

Otherwise I think your only option would be to restart processing of the request with something like (untested, pseudo example):

env['REQUEST_URI'] = new_controller_uri_with_your_params
call(env)

This is similar to how integration tests are implemented. But I don't know if everything from call until you hit a controller is idempotent and safe to rerun like this. You could trace through the source and see. But even if it's ok now, it might break in any future version of rails or rack.

Using middleware would avoid this by letting you intercept the request before it's been run. You should still be able to share code with your rails application by extracting it out into common modules included in both places.

Honestly I think just doing the simple thing of factoring the common controller code is likely cleaner, but it's hard to know without the details of your situation so I thought I'd go ahead and suggest this.

0
ответ дан 3 December 2019 в 18:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: