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() функция от этого вопроса.