0

У меня есть действие, показывающее действие контроллера, которое делает некоторые вещи и визуализирует представление, но из-за какой-то пользовательской маршрутизации мне нужно совершенно другое действие в совершенно другом контроллере для выполнения одного и того же материала и отображения одного и того же представления.Дублирование действия контроллера Rails

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

Edit:

я в основном нужно выполнить следующую команду из коллекции # Show, а также из галереи # SplitUrl:

@collection = Collection.find_by_id(params[:id]) 
if @collection.has_children? 
    @collections = @collection.children 
else 
    redirect_to [@collection, :albums] 
end 

Я не могу просто redirect_to Collection # Показать в конце галереи # SplitUrl как перенаправление заставляет мой пользовательский URL-адрес теряться, поскольку это новый запрос.

+0

http://stackoverflow.com/questions/5767222/rails-call-another-controller-action-from-a-controller –

ответ

0

Вы можете поместить содержимое представления в партию (/app/views/home/_example.html.erb), а затем использовать команду render "example" в HomeController.

Код «некоторые вещи», о котором вы говорите, может быть помещен в вспомогательный файл /app/helpers/..., чтобы избавить вас от дублирования кода в двух отдельных контроллерах, хотя это может зависеть от того, что пытается сделать код в первую очередь.

http://guides.rubyonrails.org/layouts_and_rendering.html

Это может предоставить более подробную информацию по этому вопросу в целом.

+0

Я добавил дополнительную информацию в мой первоначальный пост. – rctneil

0

Я думаю, что самым простым подходом было бы добавить определение маршрута для вашего нового url и сопоставить его с существующим controlleraction.

Нечто подобное следующим образом:

# config/routes.rb 

# Existing resource 
resources :foos 

# The resource in question 
resources :bars do 
    get :show, controller: 'foos', action: 'show', as: bar_foo_common_show 
end 

Обратите внимание, что это даст вам /bar/:id, где id представляет собой bar ресурс. Поэтому в вашем действии foo#show ваш искатель должен быть выполнен в соответствующем классе. Это когда несколько строк хакерских кодов добавляются, например. проверка для запроса.

Я думаю, переместив общий код функции в возможно application_controller и вызова этой функции из обоих show действий будет чище подход, но основанный на моем понимании, у вас уже есть подобный сценарий для общего кода в application_controller за исключением, и будет как попробовать другой подход!

+0

Причина в том, что у меня есть маршрут, который для моих маршрутов фотогалереи в галерею # SplitUrl должен затем разделить URL-адрес на «/» и выяснить, к чему пользователь пытается получить доступ, поскольку я хочу, чтобы URL-адрес/галерея/collection1name/collection2name/collection3name/album1name Модели, которые у меня есть, Collection, Album и Photo and Collection - это самореляционная модель, поэтому коллекция может содержать другие коллекции или альбомы, но не обе в то же время. Есть идеи? – rctneil