Как отправить ошибки формы туда, откуда они пришли? - PullRequest
1 голос
/ 23 февраля 2011

У меня есть страница, которая показывает книгу, и это много отзывов. На этой странице также есть форма, чтобы написать новый отзыв и опубликовать его в действии создания контроллера отзывов. Когда вы публикуете форму, отправляется также идентификатор соответствующей книги, чтобы отношения могли быть установлены правильно.

На контроллере отзывов мы пытаемся сохранить обзор. Вот как выглядит мой контроллер:

def create
    @review  = current_user.reviews.build(params[:review])
    @book = Book.find_by_ean params[:book]
    @review.book = @book

    if @review.save
      redirect_to book_path(@book)
    else
      # In here I want to go back to book_path(@book), sending @review with it so that I can have access to @review.errors
    end
  end

Конечно, когда рецензию не удается сохранить (например, рецензирование является обязательным), я хотел бы вернуться на страницу показа книги и отобразить форму вместе с ошибками для пользователя. Теперь, насколько я могу понять, здесь есть 2 возможности:

  1. render "books / show",: review => @review --- Это действительно возвращает отзыв с сопровождающими ошибками (думаю, не на 100%), но URL остается как "/ reviews", что вызывает тонны его собственных проблем. Например, партиалы, которые я храню в каталоге "/ books", не найдены.
  2. redirect_to book_path (@book) --- Это возвращает меня к нужному URL, но не отправляет @review вместе с ним, поэтому я не могу показать сообщения об ошибках.

Как лучше всего решить эту проблему?

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Обычно я решаю эту проблему, отправляя данные psot действию члена в исходном контроллере (в данном случае в книгах) вместо вложенного контроллера.Например:

# routes.rb
resources :books do
  member do
    post 'create_review'
  end
end

А потом, на ваш взгляд,

# books/show.html.erb
<%= form_for @new_review, :url => create_review_book_path(@book) do |f| %>
...
<% end %>

И, наконец, в ваших книгах контроллер

# books_controller.rb
def create_review
  @book = Book.find(params[:id])
  @new_review = @book.reviews.build(params[:review])
  if @new_review.save
    @new_review = Review.new
  end
  render :action => :show
end

Что происходит, если форма была вручнуюнаправить его данные на наш новый маршрут участника в контроллере книг.Если обзор успешно сохранен, то мы назначаем новый объект обзора переменной для подготовки к следующему обзору.Если это не удачно, то переменная @new_review будет содержать ошибки, к которым можно получить доступ в форме.

0 голосов
/ 23 февраля 2011

Что ж, вы не можете действительно передать объект через параметры get (с перенаправлением), если вы не сериализовали его и не хотите этого.

Я вижу два решения этой проблемы.1) Сохраните рецензию в контроллере книг. 2) Сделайте отправку формы через ajax и обновите форму в контроллере рецензии, используя «render: update»

. Я не знаю, какой из них лучший, это зависитна спецификации проекта, как вы можете использовать AJAX?

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