Итак, у меня есть страница редактирования книги, которая содержит уникальные поля (Название, ISBN). Но прежде чем я отправлю форму для обновления, мне нужно сначала отправить информацию формы на другую страницу подтверждения, а затем обновить. Но когда я передаю информацию формы на страницу подтверждения, уникальные проверки заголовка и ISBN не работают. У меня есть такой код:

book.rb

  validates :title, presence: true,
                    uniqueness: true
  validates :isbn,  presence: true, 
                    uniqueness: true,
                    format: { with: /[0-9]/ }

edit.html.erb

<%= form_for @book, url: confirm_edit_admin_book_path, method: :patch, html: { class: "form" } do |f| %>
        <%= f.hidden_field :id %>
        <div class="float-right">
            <button class="btn btn-primary">Confirm</button>
        </div>
        <h4 class="card-title">Edit Book</h4>
        <div class="form-group row mt-5">
            <%= f.label :title, class: "col-md-2 col-form-label required" %>

            <div class="col-md-10">
                <%= f.text_field :title, class: "form-control" %>
                <%= render "admin/shared/error_field", field: :title %>
            </div>
        </div>

        <div class="form-group row">
            <%= f.label :isbn, "ISBN", class: "col-md-2 col-form-label required" %>

            <div class="col-md-10">
                <%= f.text_field :isbn, class: 'col-sm-12 form-control' %>
                <%= render "admin/shared/error_field", field: :isbn %>
            </div>
        </div>

        <div class="form-group row">
            <%= f.label :released_at, class: "col-md-2 col-form-label required" %>

            <div class="col-md-10">
                <%= f.date_field :released_at, class: 'col-sm-12 form-control' %>
                <%= render "admin/shared/error_field", field: :released_at %>
            </div>
        </div>

        <div class="form-group row">
            <%= f.label :description, class: "col-md-2 col-form-label" %>

            <div class="col-md-10">                       
                <%= f.text_area :description, class: 'col-sm-12 form-control' %>
                <%= render "admin/shared/error_field", field: :description %>
            </div>
        </div>

        <div class="form-group row">
            <%= f.label :quantity, class: "col-md-2 col-form-label required" %>

            <div class="col-md-10">                       
                <%= f.number_field :quantity, class: 'col-sm-12 form-control' %>
                <%= render "admin/shared/error_field", field: :quantity %>
            </div>
        </div>

        <div class="float-right">
            <%= f.submit "Confirm", class: "btn cur-p btn-primary" %>
        </div>
    <% end %>

books_controller.rb

def confirm_edit
  @book = Book.new(book_params)
  book_info = Book.find(@book.id)
  if @book.valid?
    session[:book_update] = @book
  else 
    render 'edit'
  end
end

def update
  @book = Book.find(params[:id])
  @book.update_attributes(session[:book_update].compact)
  session.delete(:book_update)
  redirect_to admin_book_url
end
0
Ivan Ray Maple Buglosa 9 Ноя 2018 в 10:45

1 ответ

Лучший ответ

В действии confirm_edit вы создаете новый экземпляр Book, используя параметры из действия обновления, которые предположительно являются параметрами из существующей книги.

@book = Book.new(book_params)

Затем вы вызываете @book.valid?, что приведет к сбою (если вы не изменили заголовок и ISBN), потому что книга с такими же значениями уже находится в базе данных.

Возможно, вы могли бы получить книгу из базы данных, а затем использовать .assign_attributes для проверки действительности таким способом?

def confirm_edit
  @book = Book.find(params[:id])
  @book.assign_attributes(book_params)
  if @book.valid?
    session[:book_update] = @book
  else 
    render 'edit'
  end
end
0
A_rayB 9 Ноя 2018 в 08:39