Как обновить уникальные поля, используя страницу подтверждения? - PullRequest
0 голосов
/ 09 ноября 2018

Итак, у меня есть страница редактирования этой книги, которая содержит уникальные поля (название, 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

1 Ответ

0 голосов
/ 09 ноября 2018

В действии 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...