Передача @объекта в частичный рендеринг рельсов
У меня есть частичное:
"профили/_show.html.erb
который содержит код типа
<%= @profile.fullname %>
Я пытаюсь сделать частичное, но я не уверен, как передать @profile. Я пробовал использовать локальный, но, по-видимому, он устанавливает "профиль" на моем частичном, а не в "@profile".
<%= render :partial => 'profiles/show', :locals => {:profile => @app.profile} %>
В любом случае передать объект как @object вместо объекта, или он разработан таким образом?
Ответы
Ответ 1
Почему так важно, что вы используете переменную экземпляра (переменные, имена которых начинаются с "@", например: @object) в частичном? Это не хорошая привычка. Использование переменных экземпляра в частицах усложняет поток управления, что облегчает ошибки и затрудняет повторное использование частичных данных. Это сообщение объясняет проблему немного более подробно.
Действительно, у вас есть два варианта. Первый вариант - предлагаемое решение.
-
Измените все переменные экземпляра на локальную переменную и передайте ее частичной с аргументом locals для рендеринга.
-
Задайте переменную экземпляра перед рендерингом части. Частицы имеют доступ ко всем переменным экземпляра, установленным вашим контроллером.
Снова переменные экземпляра в частичных файлах являются плохими. Вы никогда не должны устанавливать переменные экземпляра только потому, что ваши частичные файлы уже написаны для их использования. Вместо этого перепишите часть.
Ответ 2
Действительно, цитируя этот пост, вы должны знать:
Частичное является многократно используемым шаблоном представления, оно позволяет вам модулировать компоненты, которые составляют определенную страницу в логические, связные части. Когда требуемые данные не передаются в частичное, их часто трудно повторно использовать или изменить позже.
Сайт руководства по рельсам объясняет несколько простых случаев использования:
Вы также можете передавать локальные переменные в партиалы, делая их еще более мощными и гибкими. Например, вы можете использовать эту технику, чтобы уменьшить дублирование между новыми и редактируемыми страницами, сохраняя при этом немного различного контента...
Так что в вашем конкретном случае есть простой и мощный способ сделать это
<%= render partial: 'show', locals: {profile: @profile} %>
Дополнительный совет:
Вероятно, частичное имя шоу не является хорошим вариантом, дайте ему более осмысленное имя, связанное с тем, что вы пытаетесь использовать повторно. Это звучит еще более склонно к ошибкам/путанице в сценарии RESTful, когда у вас действительно есть метод show, поэтому, вероятно, это будет файл _show.html.erb и файл show.html.erb.
Надеюсь, это помогло.
Ответ 3
Для Rails 3+ ответ на ваш реальный вопрос:
<%= render 'profiles/show', :@profile => blah %>
Теперь ваша частичная часть будет видеть локально @profile
.
Я не говорю, что это хороший подход. Я честно не уверен, что это уродливо или нет. Но он работает.
Ответ 4
Вы всегда можете сделать @profile = profile
в частичном.
Ответ 5
это проще
<%= render :partial => "profiles/show", :collection => @profiles %>
на частичном _show.html.erb
<%= profile.fullname %>
Надежда помогла