printLine
увеличивает переменную count
, но это никогда не сбрасывается.
Так что однажды $count == 8
, цикл until
ничего не делает.
Вместо вызова кода между действиями извлеките код в 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
Создайте экземпляр класса контроллера:
@my_other_controller = MyOtherController.new
Затем вызовите на нем методы:
@my_other_controller.some_method(params[:id])
Я предпочитаю идею модуля, но это должно помочь.
Если два контроллера пытаются сделать одно и то же, очень высока вероятность, что это должно быть в модели. Внимательно посмотрите на свой дизайн и - извините, я не знаю вашего уровня опыта работы с 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
Если проблема в том, что вам нужен другой контроллер для рендеринга, то, возможно, маршрут должен был указывать туда, чтобы начать с , и все же техника тонкого контроллера должна спасти положение.
Я подозреваю, что вам нужен вариант 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
Сделайте следующее:
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
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.