Передача параметров в рендер - 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 with
params[: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'
.
Проверьте документацию по рельсам относительно частичных рендереров.