2016-10-25 4 views
1

Недавно я столкнулся с сложной ситуацией, связанной с помощниками рельсов. Ситуация следующая:Как работает Rails View Helper

У меня есть контроллер как Feature1::Feature1.1::Feature1.1.1Controller. Feature1.1 также включает другие контроллеры, как Feature1.1.2Controller, Feature1.1.3Controller ...

Так конечно, связанные просмотреть хелперов в папке app/helpers/feature1/feature1.1/...

Теперь реальная проблема я столкнулся в том, что несколько помощников для feature1.1 включает в себя такое же имя метода method1 с соответствующим определением.

мне было интересно, как рельсы идентифицирует все эти помощник, как я заметил, что method1 т.е. вызывается в представлении для контроллера feature1.1.1 использует определение method1 т.е. написанные для контроллера feature1.1.2.

Так рельсы рассматривают все вспомогательные модули, определенные в одной папке, как один?

feature1/feature1.1/feature1.1.1/index Я делаю вызов метода для method1.

Я использую rails3

+0

Где вы включаете помощников вида? – David

+0

Я использую настройку по умолчанию, которая включает в себя все вспомогательные по умолчанию – Swaps

+0

Конечно. Чтобы получить доступ к помощникам в контроллерах, вам необходимо включить, но из представлений, которые они доступны на глобальном уровне. Я не думаю, что есть легкое решение вашего затруднительного положения, похоже, вам придется отрисовывать помощников в слое OO, используя драгоценный камень, такой как [Ячейки] (https://github.com/apotonick/cells) - проверьте out https: // apotonick.wordpress.com/2011/10/05/rails-misapprehensions-helpers-are-shit/ для углубленного обзора этой проблемы. – David

ответ

0

Я провел некоторое исследование и хотел бы поделиться дополнительной информацией. Как упоминалось в @ slowjack2k, просмотр справки включены рельсами в качестве поведения по умолчанию. Но мой вопрос касался ситуации с теми же именами методов в нескольких помощниках. Я нашел this статью, которая будет полезна в этом сценарии. Хотя это объясняет поведение для Rails 4, но я обнаружил, что он ведет себя одинаково для Rails 3.2.2.

Я резюмировать статью -

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

1

Это зависит немного от версии Rails. С версиями Reral Reral Rails включали только application_helper.rb и <controler_name>_helper.rb. Дополнительные вспомогательные модули могут быть включены через helper :helper_name1, :helper_name2, ... в ваш контроллер.

С более поздними версиями Rails (4.2.? И вверх, возможно, предыдущие версии) Rails включает в себя все помощники в вашей вспомогательной папке одновременно. Вы можете установить config.action_controller.include_all_helpers = false в пределах application.rb, и вы вернетесь к старому поведению.

Это позволяет использовать хелпер только в ваших представлениях. Если вы хотите использовать помощника в своем контроллере, вам все равно придется включить ваш помощник с include XXXHelper.

Смежные вопросы