@WEB_champion

Почему при рендера в другой view содержимое страницы меняется, но url только другой в Rails 4???

Rails версии 4. Контроллер REST.
Обычное добавление через /product/new
А в контроллере Product присутствует метод create:
# POST /product
def create 
@product = Product.new(params[:product])
if @product.save
redirect_to @product
else
render :new
end
end

Допустим, не получилось добавить продукт, и должно рендерится :new , и это работает, содержимое страницы меняется, но вместо того, чтобы url страницы поменялось на /product/new, меняется на /product. Так же не красиво.
Как решить проблему?
  • Вопрос задан
  • 2208 просмотров
Решения вопроса 1
viktorvsk
@viktorvsk
На самом деле все ок. Ничего в этом страшного нет и все логично.
Во flash складывать ничего не нужно. Он придуман для коротких текстовых сообщений, а не для объектов. Потому что он сохраняется в сессии, а там особо не разгуляешься. Плюс с сериализацией замахаетесь.

Если уж очень сильно хочется изменить адрес, то хакните так: в шаблон new.html.erb
Добавьте вот что:
<% unless @product.valid? %>
<script>window.history.replaceState(null,null,"products/new")</script>
<% end %>
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
AMar4enko
@AMar4enko
А почему должно быть иначе-то?
Логика:
Когда делают POST-запрос на адрес /product
Если продукт сохранился, то перейти на страницу продукта
Иначе вывести вьюху new
Вот у вас и получается, что при ошибке сохранения вы по тому же самому адресу получаете вьюху new.
Можете сделать редирект на /product/new так же, как на product, только не забудьте тогда во флеш сохранить параметры и там их восстановить в форму - никому не охота из-за ошибки по 10 раз формы заполнять.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы