Форма RoR: добавление текста за полем ввода

Я сейчас работаю над регистрационной формой. Пользователи должны регистрироваться только с адресом электронной почты, принадлежащим определенному домену (например, @example.com). Я хочу добавить этот домен в виде текста за полем ввода электронной почты, чтобы пользователям было понятно, что вводить. К сожалению, кажется невозможным написать что-то за полем ввода, поскольку рельсы автоматически делают перенос строки.
Это соответствующая часть формы:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
    <%= devise_error_messages! %>
    <div class="field">
        <%= f.label :email %>
        <%= f.text_field :email, autofocus: true %>[@example.com]
    </div>
   
    <div class="actions">
        <%= f.submit "register", class: "button" %>
    </div>
<% end %>

Результат должен выглядеть как [ ] @example.com
Также мне нужно, чтобы адрес электронной почты был фактическим адресом электронной почты. Поэтому мне также нужно манипулировать вводом, например. john на [email protected] перед сохранением пользователя в базе данных.

Как я могу достичь этих двух вещей?


person me_kalli    schedule 23.07.2020    source источник
comment
Для вопроса о макете проверьте/добавьте CSS для .field. По умолчанию помощник text_field устанавливает display: inline-block, что должно дать вам нужный макет. Я подозреваю, что ваш CSS на родительском <div> переопределяет это.   -  person rmlockerd    schedule 24.07.2020
comment
Спасибо. Похоже, фонд перезаписал это. Добавление display: inline-block !important к заголовку позволило расположить несколько полей ввода в одной строке. К сожалению, текст (как обычный HTML и как метка) по-прежнему перемещается на следующую строку.   -  person me_kalli    schedule 24.07.2020


Ответы (1)


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

def create
 @foo = Foo.new(foo_params)
 @foo.email = mangle_email(@foo.email)
 if @foo.save
   ... # normal stuff
 end
end

В вашем конкретном случае вы должны рассмотреть различные сценарии ввода (например, пользователь добавляет @domain самостоятельно и т. д.), поскольку во многих случаях просто добавление чего-либо в конец пользовательского ввода, вероятно, не то, что вы повторно после.

person rmlockerd    schedule 23.07.2020
comment
Спасибо. Есть ли разница между проделыванием этих манипуляций в экшене контроллера и в before_save в модели, кроме того, что в модели это будет выполняться при всех операциях записи, а в контроллере только при этом экшене? - person me_kalli; 24.07.2020
comment
Нет, нет никакой разницы, кроме того, где живет логика и когда она работает (как вы заметили). Я полагаю, что выбор будет зависеть от того, насколько поведение является внутренним для модели, а не причудой пользовательского интерфейса. FWIW, случай, который вы описали, больше похож на короткий путь во время первоначального создания, а не на то, что вы хотели бы применять каждый раз при изменении модели. - person rmlockerd; 24.07.2020
comment
К сожалению, я использую Devise для управления пользователями и не могу ни изменить действие контроллера, не переписав весь контроллер, ни изменить модель, не сделав регистрацию невозможной из-за встроенной проверки электронной почты Devise. Есть ли способ использовать Javascript на стороне клиента для выполнения этих манипуляций перед отправкой на сервер? - person me_kalli; 24.07.2020