Render: новый не будет в нужном месте после проверки
У меня есть "новая" форма, которая проверяется в модели post. Когда валидатор запускается, он отображается неправильно.
Новый путь к странице сообщений находится в '/posts/new'
При проверке новый путь к странице отправляется в '/posts'. Мне нужно, чтобы он вернулся к '/posts/new'.
Это мой контроллер:
def create
@post = current_user.posts.build(params[:post])
if @post.save
redirect_to public_post_page_path(@post.public_url)
else
render :action => :new
end
end
У меня такое чувство, что это может быть связано с моей формой. Итак, вот форматная первая строка:
<%= semantic_form_for [:student, post], :html => {:id => "post_form"} do |form| %>
Ответы
Ответ 1
Это правильное поведение из рельсов.
В действии create он просто отображает "новый" файл вида. Таким образом, url будет /posts, но представление будет правильно отображать форму. В этом поведении нет ничего плохого; и в целом рельсы конвенции является хорошей формой. Также встроенные ошибки рельсов работают, если вы просто визуализируете new; однако, если вы перенаправите их, они не будут отображаться.
Если вам действительно хочется вернуться к этому URL-адресу, вам нужно использовать:
redirect_to
вместо рендеринга.
Ответ 2
Если проверка не удалась, пользователь должен увидеть форму с ошибками и остаться в /posts/new
. Что ты хочешь, правильно?
Там есть простой способ добиться этого.
Установите remote: true
в форме, чтобы предотвратить продвижение URL. Обращайтесь к ajax:success
, чтобы заменить форму на странице новым.
$('form[data-remote=true]').on 'ajax:success', (e, data, status, xhr) ->
if isHTML(data)
thisForm = "form[id=#{@getAttribute('id')}]"
$(thisForm).replaceWith $(data).find(thisForm)
isHtml()
функция от этого вопроса.