«Должен существовать родительский элемент» и «Не найден шаблон для CommentsController#create, rendering head:no_content» Rails 5

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Я получаю странную ошибку с формой «Новый комментарий».

Во-первых, когда я отправляю комментарий, я получаю всплывающее окно для сохранения файла (файла для сохранения нет).

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

Это моя ошибка при отправке:

 errors: ["Parent must exist"]
No template found for Events::CommentsController#create, rendering head :no_content
  

(Однако, когда вы отправляете комментарий с заголовком, он работает так, как ожидалось)

comments_controller.rb

   def create
    @comment = @commentable.comments.build(comment_params)
    if @comment.save
      flash[:success] = "Your comment was successfully saved."
      redirect_to @commentable
    else
      puts "errors: #{@comment.errors.full_messages}"
      flash[:danger] = "Uh Oh"
    end
  end
  

schema.rb

   create_table "comments", force: :cascade do |t|
    t.integer "parent_id"
    t.string "commentable_type"
    t.bigint "commentable_id"
  end
  

comment.rb

 class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true

  belongs_to :parent, class_name: "Comment"
  has_many :children, class_name: "Comment", foreign_key: :parent_id, dependent: :destroy
end
  

new_comment_form.html.erb

 <%= form_for [commentable, Comment.new] do |f| %>
  <div class="form-group">
    <div class="col-6">
      <%= f.text_area :body, class: "form-control", placeholder: "", style: "height: 200px;" %>
    </div>
  </div>
  <div class="form-group">
    <div class="col-3">
      <%= f.submit "add comment", class: "btn btn-light ", id: "submit-comment" %>
    </div>
  </div>
<% end %>
  

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

1. Что вы подразумеваете под «я получаю всплывающее окно для сохранения файла»? Ничто в показанном вами коде не является «всплывающим», и нет никакого кода о «файле», и вы не предоставили общий доступ к соответствующему коду просмотра.

2. … Судя по вашей правке, вы сейчас говорите, что хотите, чтобы parent было необязательным? В этом случае вам нужно belongs_to :parent, class_name: "Comment", optional: true

3. Хорошие моменты. Приложит скриншот всплывающего окна и код просмотра к вопросу. amp; Добавит optional: true , подумал, не должно ли это быть по умолчанию для int в таблице SQL?

4. Это не «требуется в SQL», если вы не устанавливаете ограничение на внешний ключ. Чего у вас нет. Однако, начиная с rails 5, это является обязательным полем в качестве правила проверки приложения.

Ответ №1:

В Rails 5 по умолчанию требуется belongs_to объединение — об этом есть отличная статья здесь.

В принципе, вам просто нужно пометить ваши belongs_to отношения как необязательные:

 belongs_to :parent, class_name: "Comment", optional: true
  

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

1. Решает проблему, хотя и не объясняет странное поведение при возникновении ошибки. Спасибо вам обоим и Tom_lord