Передать параметры в рендере - Rails 3

Я видел пару вопросов по этому поводу, но не смог их решить...

Я пытаюсь передать параметр при частичном рендеринге (аналогично domainname.com/memory_books/new?fbookupload=yes)

Прямо сейчас я использую эту строку:

<%= render :partial => '/memory_books/new', :fbookupload => "yes" %>

и частично я попытался получить содержимое fbookupload, используя:

<%= fbookupload %>

который дает ошибку "неопределенная локальная переменная" и

<%= params.inspect %>

который не показывает fbookupload в качестве параметра.

Как я могу частично передать параметр :fbookupload?

Спасибо.

ОБНОВЛЕНИЕ:

Может ли это быть как-то связано с тем, что я визуализирую это в рендере?

т. е. страница (/fbookphotos/show), на которой

<%= render :partial => '/memory_books/new', :fbookupload => "yes" %>

отображается другой страницей с (posts/show) через:

<%= render :partial => '/fbookphotos/show' %>

поэтому я визуализирую это в рендере.


person user749798    schedule 01.07.2012    source источник


Ответы (5)


попробуй это:

<%= render :partial => '/memory_books/new', :locals => {:fbookupload => "yes"} %>
person Someth Victory    schedule 01.07.2012
comment
Я думаю, что ваш код в порядке, что-то не так с вашим частичным кодом? - person Someth Victory; 01.07.2012
comment
остальные частичные нагрузки. может быть это как-то связано с моей частичной загрузкой внутри частичной? - person user749798; 01.07.2012
comment
это нормально, если часть загружается внутри другой части. Что-то с кешем браузера? - person Someth Victory; 01.07.2012
comment
получил это, ссылался на партиал в другом месте без локальной переменной и, таким образом, испортил рендеринг. Благодарность! - person user749798; 01.07.2012

Вынесу это из комментариев для потомков. Этот синтаксис правильный:

render '/memory_books/new', fbookupload: "yes"

Но если есть ссылка на рендеринг того же партиала без указания локальных переменных, например.

render '/memory_books/new'

тогда переменная fbookupload становится недоступной. То же самое относится к нескольким локальным переменным, например.

render 'my_partial', var1: 'qq', var2: 'qqq'

будет работать, если произойдет только один раз. Но если что-то подобное есть где-то еще в коде

render 'my_partial', var1: 'qq'

тогда var2 станет недоступным. Иди разберись...

person Vadym Tyemirov    schedule 17.11.2013

Params — это просто параметр запроса, поэтому, если вы хотите передать его в params, вы должны добавить его к своему URL-адресу ?fbookupload=yes или назначить его params[:fbookupload] = "yes", но я не думаю, что это хорошая идея.

Но если вам нужно использовать params[:fbookupload]', u can replace it withparams[:fbookupload] || fbookupload' и передайте fbookupload в хеш локального файла для частичного.

person Yuri Barbashov    schedule 01.07.2012
comment
как бы я добавил его к URL-адресу в рендере? когда я делаю ‹%= render :partial =› '/memory_books/new?fbookupload=yes' %›, я получаю частичную ошибку Missing - person user749798; 01.07.2012
comment
не в частичном, а в URL-адресе вашего браузера... но это не очень хороший способ, не используйте параметры в частичных, используйте локальные переменные - person Yuri Barbashov; 01.07.2012
comment
@Yuri Barbashov: Вы путаете две вещи: параметры URL, заданные для представления, и параметры, заданные для частичного. В зависимости от значения входящих параметров URL-адреса могут отображаться разные представления и/или частичные представления, но это определяется после того, как контроллер анализирует параметры URL-адреса. Я предполагаю, что можно можно использовать входящие параметры URL для условного перенаправления в другое представление и, возможно, использовать параметры URL в этом перенаправлении (на самом деле, я даже не знаю, возможно ли последнее), но это не совсем то, для чего перенаправление, и мне кажется, что это нехорошо. - person Teemu Leisti; 25.06.2013
comment
@TeemuLeisti Я не путаю две вещи: params в партиалах содержит параметры URL. Если вы посмотрите на вопрос, вы увидите, что он пытался проверить `params', поэтому я показал, как он может этого добиться, присвоив значение params, и сказал, что это нехорошо. - person Yuri Barbashov; 26.06.2013
comment
@Yuri Barbashov: Правильно, пользователь 749798 сказал, что это похоже на URL-адрес с параметрами. Однако прямая причина для отображения частичного представления заключается в том, что другое представление запрашивает это. На этот случай в Rails есть стандартный метод передачи параметров (см. ответы Someth Victory и Anil). Попытка добиться того же с использованием параметров URL кажется мне уродливым хаком, если это вообще возможно. Параметры URL являются стандартным механизмом передачи параметров для методов контроллера, которые затем отображают обычные представления. Но если вы не согласны, то мы просто должны согласиться не согласиться. - person Teemu Leisti; 26.06.2013
comment
@Yuri Barbashov: но хорошо, ты сказал, что думал, что это нехорошо, что я сначала пропустил. Я пытался отменить свой отрицательный голос по вашему ответу, но это невозможно, если ответ не отредактирован. - person Teemu Leisti; 26.06.2013

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

Следующие два эквивалентны:

<%= render "my_partial', my_param: true %>

и:

<%= render partial: "my_partial', locals: { my_param: true } %>

Первый — это сокращение, позволяющее опустить partial:. С этим сокращением локальные переменные также не вложены в locals:. Это хорошо объяснено в документации (см. «Визуализация по умолчанию»). .

В двух приведенных выше случаях вы могли бы получить доступ к my_param в партиале напрямую с помощью my_param.

Еще один источник путаницы заключается в том, что если вы визуализируете партиал где-то без передачи my_param, то партиал не сможет получить к нему доступ. Чтобы обойти это, вы можете получить доступ к локальному с помощью local_assigns[:my_param] вместо my_param, что даст вам nil, если параметр не определен, вместо ошибки, как описано в этой документации. Другой альтернативой является использование defined?(my_param) перед доступом к нему.

person stephen.hanson    schedule 06.11.2020

Чтобы сделать это по-своему:

В основном виде:

<% fbookupload = "yes" %>
<%= render :partial => '/memory_books/new', :locals => {:fbookupload => fbookupload} %>

И в частичном:

<%= fbookupload %>

2-й вариант:

В идеале в контроллере, иначе в представлении, определите переменную экземпляра: @fbookupload = "yes". Тогда это доступно везде. Партиал тогда будет: <%= @fbookupload %>

person Anil    schedule 01.07.2012