Рельсы, не удается настроить сообщение об ошибке проверки ввода

#javascript #ruby-on-rails

Вопрос:

У меня есть следующий код в контроллере и модели. Он предназначен для проверки того, существует ли уже модель, и возврата сообщения об ошибке, если она существует:

Контроллер

   def new
    @book = Book.new
  end 

  def create

    @book = Book.new(book_params)
    @book.user_id = current_user.id
   
    if @book.save
      redirect_to book_url(@book)
    else 
      @errors = @book.errors.full_messages.first
      redirect_to new_book_url(@errors), alert: @errors

    end
end
 

Модель

   validate :existing_book, on: :create

  def existing_book

    existing_book = Book.find_by('author LIKE ? AND publisher LIKE ?', "#{self.author}", "#{self.publisher}")

    existing_book ||= Book.find_by(name: self.name, date: self.date)

    if existing_book != nil
      errors.add(:name, message: ":This book may already exist.")
    end

  end
 

Моя проблема в том, что:

После создания книги, которая уже существует, она сначала переходит на экран ошибок rails ( No route matches [GET] "/books/new.Name :This book may already exist." ). Затем, когда я нажимаю кнопку «Назад»в браузере, появляется страница создания книги с сообщением об ошибке внизу: «Название :Эта книга, возможно, уже существует».

Чего бы я хотел, так это:

После создания уже существующей книги экран должен оставаться на странице создания этой книги и отображать всплывающее сообщение. Так что это должно вызвать событие. По крайней мере, он должен оставаться на том же экране и показывать правильное сообщение об ошибке (без «Имени», даже если оно не появится; если я удалю «:имя», я получу эту ошибку: wrong number of arguments (given 0, expected 1..2) ).

Другая проблема в том, что я не понимаю, как это сделать. Я был бы очень признателен вам за помощь.

Комментарии:

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

Ответ №1:

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

 redirect_to new_book_url(@errors), alert: @errors
 

Скорее всего, вы просто захотите сделать render :new это вместо этого (и убедитесь, что вы визуализируете @errors в этом представлении).

Комментарии:

1. Что касается другого, попробуйте добавить свое сообщение в :base вместо :name

2. Спасибо. Когда я пытаюсь ` » отобразить :новый, предупреждение: @ошибки и создать дубликат книги, я получаю точно такую же страницу создания книги. Никаких сообщений об ошибках. Как я могу отобразить сообщение об ошибке и сделать его всплывающим?

3. @superbot: вы должны отобразить ошибки в представлении (обычно это делается в файле макета). Проверить railstutorial.org , это касается этого.