Ответ 1
Поверьте, я нашел решение. Для тех, у кого есть эта проблема, указывая форму следующим образом:
<%= form_tag '/page#form' do %>
Кажется, проблема решена.
Я хочу использовать render так:
render :action => 'page#form'
Я также пробовал это:
render :template => 'site/page#form'
Это тоже не сработало. Форма на этой конкретной странице находится в самом низу, и, если какие-либо ошибки возникают при подаче, я бы не хотел, чтобы пользователь по умолчанию был в верхней части страницы. Мне также нужно использовать render (not redirect), потому что мне нужно сохранить объекты и их ошибки.
Как я могу визуализировать целевой тег привязки?
Поверьте, я нашел решение. Для тех, у кого есть эта проблема, указывая форму следующим образом:
<%= form_tag '/page#form' do %>
Кажется, проблема решена.
Краткая сводка о 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-формы и впоследствии добавят наш якорь в конце.
Используйте JavaScript, чтобы переместить представление в нужное место. Я не знаю, как это сделать.
<script>
window.location = window.location.href + "#form";
</script>
Неподтвержденный, но я думаю, что это должно сработать.
Используйте redirect_, чтобы браузер получил хэдз-ап для прокрутки к якорю:
redirect_to: action = > 'page',: anchor = > 'form'
Вы можете использовать ненавязчивый jQuery и атрибут данных.
Например, в моем приложении у меня есть большая форма, среди прочих, поле "адрес", в котором пользователь должен:
Из-за того, что после его кнопки "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"; }; });
И что это!
Я бы предложил использовать jQuerys validate plugin. Вы даже можете реализовать свои собственные помощники форм, которые используют плагин jquery validate в зависимости от того, какие атрибуты объекта вам нужно проверить.
Конечно, это больше работает, но я считаю, что это окупится в будущем.
Кроме этого - используйте сообщения с сообщением об ошибке и сообщения об ошибке процесса после получения ответа.