Как создать и редактировать рецензию на книгу в начальной загрузке - PullRequest
0 голосов
/ 03 мая 2019

Мне удалось создать отзывы, чтобы забронировать в надлежащем порядке. Но я не могу создавать и редактировать обзоры в модальностях.

Мне удалось загрузить новую форму рецензии в модальном режиме, но она загружается только в том случае, если в книге уже есть рецензии. Если у книг нет рецензий, модальная кнопка не сработает.

Я получаю эту ошибку, которую я не до конца понимаю

First argument in form cannot contain nil or be empty

, указывая на строку формы редактирования

<%= form_for([@book, @review], remote: true) do |f| %>

Я пытался реализовать модалы для книжной модели, которые работают хорошо, но обзоры - нет.

books_controller.rb

def show
  @reviews = @book.reviews
end

книги / show.html.erb

<section id="reviews-section">
  <div class="review-form">
     <% if user_signed_in? %>
        <!-- Button trigger modal -->
        <button type="button" class="btn btn-secondary btn-sm" data-toggle="modal" data-target="#mynewreview">
                Write your review
        </button>
     <% else %>
         <p>You need to <%= link_to 'sign in', new_user_session_path, class: "btn btn-warning btn-sm" %> before writing a review buddy :)</p>
     <br>
     <% end %>
  </div>
  <br>
  <div id="reviews_panel">
      <%= render @reviews %>
  </div>
</section>

Отзывы / _review.html.erb

<% if user_signed_in? %>
   <% if review.user_id == current_user.id %>
      <div class="btn-group mr-2" role="group">
        <button type="button" class="btn btn-info btn-sm" data-toggle="modal" data-target="#editreview_<%= review.id %>">Edit Modal</button>
         <%= link_to 'Delete Review', book_review_path(review.book, review), class: "btn btn-sm btn-danger", method: :delete, remote: true, data: { confirm: "Are you sure?" } %>
      </div>
   <% end %>
<% end %>

<%= render 'reviews/widgets/new_review_modal' %>
<%= render 'reviews/widgets/edit_review_modal' %>

обзоры / виджеты / _new_review_modal

<%= form_for([@book, @book.reviews.build], remote: true) do |f| %>
  <!-- Modal -->
  <div class="modal fade" id="mynewreview" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title" id="exampleModalLabel">Review</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body">
          <div id="rating-form">
            <label>Rating:</label>
          </div>

          <div class="field">
            <p><%= f.text_area :comment, placeholder: 'Write comment...', class: "form-control review-text-field" %></p>
          </div>
        </div>
        <div class="modal-footer">
          <div class="actions">
            <%= f.button "Submit Review", class: "btn btn-success btn-sm", data: {disable_with: "<i class='fa fa-spinner fa-spin'></i> Submitting Review..."} %>
          </div>
        </div>
      </div>
    </div>
  </div>
<% end %>

<script>
    $('#rating-form').raty({
        path: '/assets/',
        scoreName: 'review[rating]'
    });
</script>

обзоры / виджеты / _edit_review_modal

<%= form_for([@book, @review], remote: true) do |f| %>
  <!-- Modal -->
  <div class="modal fade" id="editreview_<%= review.id %>" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
    <div class="modal-dialog" role="document">
      <div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title" id="exampleModalLabel">Edit your review</h5>
          <button type="button" class="close" data-dismiss="modal" aria-label="Close">
            <span aria-hidden="true">&times;</span>
          </button>
        </div>
        <div class="modal-body">
          <div id="rating-form">
            <label>Rating:</label>
          </div>

          <div class="field">
            <p><%= f.text_area :comment, placeholder: 'Write comment...', class: "form-control review-text-field" %></p>
          </div>
        </div>
        <div class="modal-footer">
          <div class="actions">
            <%= f.button "Submit Review", class: "btn btn-success btn-sm", data: {disable_with: "<i class='fa fa-spinner fa-spin'></i> Submitting Review..."} %>
          </div>
        </div>
      </div>
    </div>
  </div>
<% end %>

<script>
    $('#rating-form').raty({
        path: '/assets/',
        scoreName: 'review[rating]',
        score: <%= @review.rating %>
    });
</script>

1 Ответ

0 голосов
/ 03 мая 2019

в reviews_controller> edit action, вы также должны найти @book и @review.

def edit
  @review = @book.reviews.find(params[:id])
end

Похоже, вы показываете все рецензии на странице показа книги.и вы хотите сделать редактирование с AJAX.В этом случае вы должны использовать какой-то цикл, и вы должны назначить один объект обзора для любой переменной.вам нужно использовать эту переменную в форме объекта

<%= @reviewes.each do |review| %>
  <% form_for [@book, review] ... do %>
    ...
  <% end %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...