Как мне использовать переменную для хеша? - PullRequest
0 голосов
/ 03 августа 2011

В моем приложении Rails у меня есть следующий метод:

def navigation_menu(items)
  # raise items.class.to_s
  # raise items.to_yaml
  render partial: 'global/navigation_menu', locals: items
end

Если я раскомментирую первую строку метода, для текста исключения будет отображаться «Хеш», доказывающий, что items является хешем. Если я раскомментирую вторую строку, будут показаны члены хэша, поэтому я также знаю, что он не пустой.

Этот метод завершается с ошибкой:

comparison of String with :navigation_menu failed

Если я заменю locals: items на locals: { dummy_key: 'dummy value' }, это сработает.

Почему я не могу использовать мою переменную items вместо явного хэша?

Ответы [ 4 ]

2 голосов
/ 03 августа 2011

Просто новичок в Ruby / Rails, но у меня была та же проблема: localals - это хэш опций, поэтому, что бы вы ни передали: localals - это хэш опций ... я имею в виду, например,

вам нужно кодировать таким образом, и если вы читаете красноречивый ruby, в нем говорится, почему - если параметр не является последним хешем, вы можете опустить фигурные скобки ...

render partial: 'global/navigation_menu', :locals => { :items => item } 

или, если вы предпочитаете,

render partial: 'gloabl/navigation_menu', locals: { items: items }

в обоих синтаксисах должны быть скобки, хотя я не пробовал НЕ использовать скобки в первой, например. во втором, однако, я считаю, что это необходимо.

надеюсь, это поможет!

1 голос
/ 03 августа 2011

Причина, по которой вы не можете просто передать локальные данные в качестве второго параметра, заключается в том, что вы указываете хэш опций для render() - в этом случае ваш хэш содержит :partial. Если вы посмотрите на документацию и код для render, вы увидите, что метод определен как:

def render(options = {}, locals = {}, &block)
...
end

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

render 'global/navigation_menu', items

Дополнительные сведения см. В разделе «Отображение регистра по умолчанию» в документации .

1 голос
/ 03 августа 2011

То, что вы написали, должно работать, я часто поступаю следующим образом.

Однако есть частный случай: хэши, имеющие ключи как строки, не могут быть правильно интерпретированы.Поэтому в этом случае необходимо добавить symbolize_keys к хешу:

  render partial: 'global/navigation_menu', locals: items.symbolize_keys
1 голос
/ 03 августа 2011

Полагаю, вам нужно включить стрелку '=>' и поместить ее в хеш {}, например:

render :partial => "global/navigation_menu", :locals => { :items => items }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...