Передача параметров в рендер - 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' %>

поэтому я рендеринг это в рендере.

4 ответа

Решение

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

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

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

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

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

render '/memory_books/new'

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

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

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

render 'my_partial', var1: 'qq'

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

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

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

<%= 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) прежде чем получить к нему доступ.

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

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

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

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

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

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

<%= fbookupload %>

2-й вариант:

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

Уже ответил, но чтобы подтвердить, что это работает с рельсами 5.2:

частичный вызов:

<%= render partial: 'some_partial', locals: { value: 'some_value' } %>

Вам нужно явно добавить partial, иначе не получится.

В самой части вы получаете доступ как local variable так что это имеет место: value == 'somevalue'.

Проверьте документацию по рельсам относительно частичных рендереров.

Другие вопросы по тегам