Размещение рельсов полей Form_For в разных местах - PullRequest
1 голос
/ 12 апреля 2020

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

<%= form_for(@micropost, remote: true) do |f| %>
  <div class="field">
    <%= f.text_field :title %>
    <%= f.text_area :content %>
  </div>
  <%= f.submit "Post" %>
<% end %>

Теперь я хочу добавить поле для ссылки, но в другом месте на странице (чтобы указать, что это необязательно).

    <%= f.text_field :link %>

Я пытался сделать все это в одном фрагменте,

<%= form_for(@micropost, remote: true) do |f| %>
  <div class="field">
    <%= f.text_field :title %>
    <%= f.text_area :content %>
    <! insert other content here >
    <%= f.text_field :link %>
  </div>
  <%= f.submit "Post" %>
<% end %>

Но это привело бы к очень грязному вложению партиалов, и я не уверен, как заставить это работать правильно , В качестве альтернативы мне было интересно, возможно ли иметь один form_for вверху страницы и другой form_for внизу страницы, которые как-то «синхронизируются», чтобы при нажатии кнопки подтверждения вверху вводилось значение в нижней форме также собраны и представлены.

<%= form_for(@micropost, remote: true) do |f| %>
  <div class="field">
    <%= f.text_field :title %>
    <%= f.text_area :content %>
  </div>
  <%= f.submit "Post" %>
<% end %>

<%= form_for(@micropost, remote: true) do |f| %>
   <! somehow sync this with the other form >
   <%= f.text_field :link %>
<% end %>

Ответы [ 2 ]

3 голосов
/ 12 апреля 2020

Один вариант - иметь вспомогательное текстовое поле для атрибута link. Скопируйте его значение в скрытую переменную, сопоставив атрибут link

Предполагая, что вы собираетесь использовать jQuery,

<%= form_for(@micropost, remote: true) do |f| %>
  <%= f.hidden_field :link %>
  <div class="field">
    <%= f.text_field :title %>
    <%= f.text_area :content %>
  </div>
  <%= f.submit "Post" %>
<% end %>

Somwhere на той же странице

<%= text_field_tag 'micropost[link]', '', id: 'aux_link' %>

<script>
  $(function(){
    $('form').on('submit', function(){
      $('#micropost_link').val($('aux_link'));
    });
  });
<script>

Это всего лишь подход. Настройте код в соответствии с вашими идентификаторами элементов формы.

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

0 голосов
/ 18 апреля 2020

Просто сделайте form_for root вида

Вы можете просто использовать form_for как контейнер div.
Затем положите <input> и <button> если вы хотите создать свою обычную веб-страницу.

Затем, поскольку вы хотите сделать некоторые входы необязательными, вы можете сделать это в контроллере rails.

def create_or_update
  params[:micropost].delete(:link) if params[:micropost][:link].blank?
  # continue the task
end

Этот прием полезен для всех необязательные поля, такие как пароль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...