render: new не собирается в нужном месте после проверки - PullRequest
16 голосов
/ 08 января 2012

У меня есть «новая» форма, которая проверяется в модели поста. Когда сработает валидатор, он рендерится неправильно.

Путь к новой странице поста находится в '/ 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| %>

Ответы [ 2 ]

13 голосов
/ 08 января 2012

Это правильное поведение от рельсов.

В действии создания он просто отображает «новый» файл представления. Таким образом, URL будет / posts, но представление будет правильно отображать форму. В этом поведении нет ничего плохого; и вообще конвенция рельсов - это хорошая форма. Также встроенные ошибки рельсов работают, если вы просто рендерите новый; однако, если вы перенаправите, они не будут отображаться.

Если вы действительно хотите вернуться к этому URL, вам нужно использовать:

redirect_to 

вместо рендера.

0 голосов
/ 06 ноября 2016

Если проверка не пройдена, пользователь должен увидеть форму с ошибками и остаться на /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() функция от этот вопрос .

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