Подтвердить что ты не робот

Rails - render: действие для привязки метки привязки?

Я хочу использовать render так:

render :action => 'page#form'

Я также пробовал это:

render :template => 'site/page#form'

Это тоже не сработало. Форма на этой конкретной странице находится в самом низу, и, если какие-либо ошибки возникают при подаче, я бы не хотел, чтобы пользователь по умолчанию был в верхней части страницы. Мне также нужно использовать render (not redirect), потому что мне нужно сохранить объекты и их ошибки.

Как я могу визуализировать целевой тег привязки?

4b9b3361

Ответ 1

Поверьте, я нашел решение. Для тех, у кого есть эта проблема, указывая форму следующим образом:

<%= form_tag '/page#form' do %>

Кажется, проблема решена.

Ответ 2

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

Прежде всего, абстрагирование от Rails, каждый базовый HTML <form> имеет возможность добавлять привязку к целевой странице, и для этого вы в основном оставляете якорь в атрибуте 'action', например:

<form action="/contact#form" method="post">
  ...
</form>

Таким образом, при отправке ваш браузер будет использовать запрос /contact#form, который позволит вам прямо указать указанный якорь.

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

  • Если вы используете form_tag в своем представлении, используйте его так, как предположил bobthabuilda:

    <%= form_tag '/contact#form' do %>
    

    Просто, просто скажите рельсам, чтобы установить действие нашей формы на /contact#form

  • Если вы используете form_for, существует параметр :anchor, который переходит в указанный :url следующим образом:

    <%= form_for @message, 
         :url => contact_path(@message, :anchor => 'form') do |form| %>
    

    или как это (если вы полагаетесь на :action):

    <%= form_for(@message, 
         :url => { :action => "create" , :anchor => "form" }) do |form| %>
    

    Таким образом, рельсы создадут правильное действие для HTML-формы и впоследствии добавят наш якорь в конце.

Ответ 3

Используйте JavaScript, чтобы переместить представление в нужное место. Я не знаю, как это сделать.

<script>
  window.location = window.location.href + "#form";
</script>

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

Ответ 4

Используйте redirect_, чтобы браузер получил хэдз-ап для прокрутки к якорю:

redirect_to: action = > 'page',: anchor = > 'form'

Ответ 5

Вы можете использовать ненавязчивый jQuery и атрибут данных.

Например, в моем приложении у меня есть большая форма, среди прочих, поле "адрес", в котором пользователь должен:

  • напишите его адрес, а затем
  • нажмите кнопку "Проверить", чтобы отобразить небольшую карту Google, чтобы узнать, правильно ли введен адрес.

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

Это мой шаблон .erb:

<fieldset id="address" data-preview="<%= params[:preview] ? true : false -%>">    
<legend>Write you address here, then check it</legend> 
  <div class="field"> 
    <%= f.text_field :address %>
    <input id="preview-button" type="submit" name="preview" value="check">
  </div>
 </fieldset>

Когда кнопка проверки нажата, она установит params[:preview]. В моем контроллере действие create выглядит следующим образом:

def create   
  @obj = current_user.objs.new(params[:obj]) 
  if params[:preview] 
    # geocoding code, and then:
    render action: "edit" 
  else
    #...
  end
end                           

Таким образом, редактирование действия будет отображаться с params[:preview], все еще определенным, и это установит префикс data-preview для файла #address в true. А именно, эта строка HTML будет отображаться:

<fieldset id="address" data-preview="true">

Теперь все, что мне нужно сделать, - это получить эту информацию с помощью javascript, а если data-preview - true, переместите расположение окна в якорь #address. Вот мой ненавязший код jQuery:

$(function() {
  var preview = $("#address").data('preview');
  if (preview == true){
    window.location = window.location.href + "#address";
  }; 
}); 

И что это!

Ответ 6

Я бы предложил использовать jQuerys validate plugin. Вы даже можете реализовать свои собственные помощники форм, которые используют плагин jquery validate в зависимости от того, какие атрибуты объекта вам нужно проверить.

Конечно, это больше работает, но я считаю, что это окупится в будущем.

Кроме этого - используйте сообщения с сообщением об ошибке и сообщения об ошибке процесса после получения ответа.