Представление Ruby для доступа к переменной angular.js

0

У меня есть угловой ng-repeat в Ruby.erb view. Теперь мне нужно сделать link_to на странице, посвященной некоторому IP-адресу. Сначала я попробовал

<td><%= link_to '{{ roll.system }}' ,'server/'+'{{ roll.system }}' %></a></td>,

где {{roll.system}} - угловая переменная, содержащая ip. Общий путь будет похож на localhost/server/127.0.0.1 и не будет работать из-за точек в IP-адресе. Теперь я пытаюсь сделать хэш из IP-адреса, а затем декодировать его после завершения маршрутизации.

Мой текущий код:

<td><%= link_to '{{ roll.system }}' ,"server/"+Base64.urlsafe_encode64('{{ roll.system }} %></a></td>

Вот проблема. Base64 кодирует строку как есть, создавая хэш литеральной строки '{{ roll.system }}'. Мне нужно, чтобы он искал значение, которое он имеет в угловой переменной.

Я не понимаю, почему это проблема, потому что link_to отлично работает.

Пожалуйста, не проконсультируйтесь с дизайном a-la 'rewrite your app from scratch'.

  • 1
    Я не уверен, что вы можете поместить угловой код JS `{{roll.system}} 'в качестве параметра link_to api.rubyonrails.org/classes/ActionView/Helpers/… выходные данные link_to должны быть действительными URL

1 ответ

2
Лучший ответ

Я думаю, что вы слегка путаете две отдельные концепции - рендеринг вида Rails и воспроизведение углового.

Когда вы нажмете свое приложение, ваше первое предложение отобразит представление Rails и превратит ваш link_to в этот необработанный HTML:

<td><a href="{{ roll.system }}/server/{{ roll.system }}"></a></td>

После того, как рельсы отобразили представление и вернули страницу в браузер, ваш Угловой код затем {{ roll.system }}, найдите {{ roll.system }} вызовы и измените это на что-то вроде:

<td><a href="127.0.0.1/server/127.0.0.1"></a></td>

Проблема со второй попыткой заключается в том, что он будет запускать Base64.urlsafe_encode64 при рендеринге Rails, поэтому Angular не заменит roll.system на этом этапе. Таким образом, вы получите этот необработанный HTML независимо от того, что такое roll.system:

 <td><a href="{{ roll.system }}/server/e3sgcm9sbC5zeXN0ZW0gfX0="></a></td>

Вместо этого вы можете попробовать base64 кодировать строку в Angular. Таким образом, вы можете посмотреть на использование чего-то вроде angular-base64. Что вы можете использовать, чтобы сделать следующее:

<td><a href="{{ roll.system }}/server/{{ roll.encoded_system }}"></a></td>

Где вы устанавливаете roll.encoded_system в своем угловом контроллере. Как упоминает Мартин ниже, существует собственный метод window.btoa(), который можно использовать для этого. Я не совсем уверен, что вы можете использовать его непосредственно в шаблоне, но его все равно нужно вызвать в контроллере.

  • 0
    Хорошее объяснение
  • 2
    Браузеры имеют встроенный кодировщик base64 btoa ()
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню