#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
Я получаю странную ошибку с формой «Новый комментарий».
Во-первых, когда я отправляю комментарий, я получаю всплывающее окно для сохранения файла (файла для сохранения нет).
Однако комментарий не создается, потому что мое приложение считает, что один из атрибутов комментария должен существовать, когда в этом нет необходимости.
Это моя ошибка при отправке:
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