Не редактируемое текстовое поле Rails


82

У меня есть form_for, написанный следующим образом:

<div class="field">
    <%= location.label :city %>
    <%= location.text_field :city, :disabled=>true%>
</div>
<div class="field">
    <%= location.label :country %>
    <%= location.text_field :country, :disabled=>true%>
</div>

Как видите, 2 текстовых поля отключены, потому что они автоматически заполняются функцией jquery, и я не хочу, чтобы пользователь мог их обрабатывать. Проблема в том, что таким образом представление не передает эти параметры контроллеру, потому что они отключены !!! Есть ли другой способ передать не редактируемое текстовое поле контроллеру, заботясь о том, чтобы я не хотел использовать скрытое поле, потому что я хочу показать результаты пользователю внутри текстового поля

TNX


с разве вы не включаете поля с jquery перед отправкой?
apneadiving

Я делаю это ... разве вы не знаете, есть ли более чистый способ сделать это?
Джо

Ответы:


196

Сделайте это только для чтения!

<%= location.text_field :country,:readonly => true%>

9
Поймите это. Спецификация W3 для форм различают disabledи read-onlyи делает его ясно , что инвалиды входы не должны быть представлены вместе с данными формы.
Робин Фишер

1
Благодаря! Я бы, наверное, потратил еще полчаса, выясняя, почему :disabled => trueне отправил свое поле.
Tom Harrison

3
Но что, если я хочу, чтобы это поле было доступно во время Createдействия?
Clone

1
Но с помощью этого метода любой может отредактировать перед отправкой. Разве это не уязвимо?
mecyborg

1
Да, это уязвимо. Пользователь может использовать «Инструменты разработчика» своего браузера (нажмите F12), чтобы удалить readonly="readonly"атрибут inputтега и отредактировать текстовое поле по своему желанию. Если вам действительно нужно, чтобы это было безопасно, полностью удалите поле ввода или подтвердите ввод формы в модели. В любом случае это был очень полезный ответ.
BrunoFacca

1

Уловка состоит в том, чтобы использовать «объект» вместе с меткой для всего, что вы не хотите менять. Вот как это следует закодировать:

<%= location.label(:country, f.object.country) %>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.