Есть ли случаи, когда Rails перезаписывает переменные экземпляра контроллера при рендеринге: частичный? - PullRequest
1 голос
/ 27 июня 2009

Есть ли случаи, когда Rails перезаписывает переменные экземпляра контроллера в рендере: частичный вызов выполняется в шаблоне? Например, скажем, у нас есть:

Контроллер

def my_action
   @widget = Widget.find(params[:id])
end    

просмотр my_action.html.erb

Hi there.
<%= render :partial => 'my_helper' %>
That's it, that's all.

просмотр _my _helper.html.erb

The id is <%= @widget.id.to_s %>.

Существуют ли какие-либо документированные сценарии (ошибки или по замыслу), в которых @widget будет равен нулю при использовании в my_helper? Я вижу такое поведение в приложении и не смог отследить его источник.

Несколько заметок:
* Приложение работает в Rails 2.1.1.
* Несмотря на то, что было бы возможно назначить локальные объекты для вызова render :part => my_helper, по ряду причин локальные пользователи не являются идеальными в этом случае.
* Я провел большую часть времени, просматривая ActionController и ActionView, но не смог изолировать поведение.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2009

Нет, Rails не будет перезаписывать переменные экземпляра в парциальном.

Думайте об этом так: представление имеет доступ ко всем переменным экземпляра контроллера, а частичное является частью представления.

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

1 голос
/ 27 июня 2009

Вот несколько странное предложение: если возможно, попробуйте использовать другое имя переменной.

С другой стороны, существует старая идея «трассирующих маркеров» Pragmatic Programmer: создать фиктивную переменную в контроллере, которую вы печатаете в различных представлениях / фрагментах, просто чтобы убедиться, что область действия / время жизни этих значений действительно соответствуют вашим ожиданиям. вместо того, чтобы «что-то» топать этой переменной из-за ее уникального имени (или кода, который вы забыли, вы написали).

Наконец, вы попробовали:

% find . -name '*rb*' | xargs grep -B 2 -A 2 -n '@widget'

или аналогичный поиск кода в приложении, верно? Обратите внимание, что если вы «заморозите» свою версию rails, весь код платформы rails будет вложен в ваше приложение, и вы также можете выполнить поиск по нему.

...