Передача @object в рельсы частичного рендера - PullRequest
20 голосов
/ 05 декабря 2009

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

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

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

<%= @profile.fullname %>

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

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

Есть ли способ передать его как @object вместо объекта, или он спроектирован таким образом?

Ответы [ 5 ]

34 голосов
/ 05 декабря 2009

Почему так важно, чтобы вы использовали переменную экземпляра (переменные, имена которых начинаются с '@', например: @object) в вашей части? Это не очень хорошая привычка. Использование переменных экземпляра в партиалах усложняет поток управления, что облегчает ошибки и затрудняет повторное использование партиалов. Это сообщение в блоге объясняет проблему более подробно.

На самом деле у вас есть два варианта. Первый вариант - это предлагаемое решение.

  1. Измените все переменные экземпляра на локальную переменную и передайте ее частному с аргументом locals для render.

  2. Установить переменную экземпляра до визуализации частичного. Частичные имеют доступ ко всем переменным экземпляра, которые устанавливает ваш контроллер.

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

14 голосов
/ 05 января 2014

Действительно, цитируя это сообщение в блоге, которое вы должны знать:

Частичное является многократно используемым шаблоном представления, оно позволяет вам модульно компоненты, которые составляют определенную страницу в логическую, связную куски. Когда необходимые данные не передаются в частичное, это часто трудно повторно использовать или изменить позже.

На сайте направляющие описаны некоторые простые случаи использования:

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

Так что в вашем конкретном случае есть простой и эффективный способ сделать это

<%= render partial: 'show', locals: {profile: @profile} %>

Дополнительный совет:
Вероятно, частичное имя шоу не является хорошим вариантом, дайте ему более осмысленное имя, связанное с тем, что вы пытаетесь использовать повторно. Это звучит еще более склонно к ошибкам / путанице в сценарии RESTful, когда у вас действительно есть метод show , поэтому, вероятно, это будет файл _show.html.erb и show. html.erb file.

Надеюсь, это помогло.

4 голосов
/ 19 января 2016

Для Rails 3+ ответ на ваш актуальный вопрос:

<%= render 'profiles/show', :@profile => blah %>

Ваш частичный теперь будет видеть @profile локально.

Я не говорю, что это хороший подход. Я честно не уверен, уродливо ли это или нет. Но это работает.

1 голос
/ 05 декабря 2009

это проще

<%= render :partial => "profiles/show", :collection => @profiles %>

в части _show.html.erb

<%= profile.fullname %>

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

1 голос
/ 05 декабря 2009

Вы всегда можете сделать @profile = profile в частичном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...