Подтвердить что ты не робот

Передача @объекта в частичный рендеринг рельсов

У меня есть частичное:

"профили/_show.html.erb

который содержит код типа

<%= @profile.fullname %>

Я пытаюсь сделать частичное, но я не уверен, как передать @profile. Я пробовал использовать локальный, но, по-видимому, он устанавливает "профиль" на моем частичном, а не в "@profile".

<%= render :partial => 'profiles/show', :locals => {:profile => @app.profile} %>

В любом случае передать объект как @object вместо объекта, или он разработан таким образом?

4b9b3361

Ответ 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 %>

Надежда помогла