Попробую построить вложенную систему комментирования Rails 5 - PullRequest
0 голосов
/ 27 сентября 2018

Не знаю, что делать на данный момент, я следовал учебному пособию, но не могу получить даже комментарии для публикации в настоящее время.Они работают просто отлично, если я возьму все соотношения / упоминания из моделей.Но я хотел бы создать функциональность для вложенной системы комментирования, где можно комментировать комментарии.Вот все соответствующие файлы + ошибки.

Новая форма комментария находится внутри страницы комментариев new.html.erb

 <div class='form-signin col-md-6 offset-md-3'>
        <%= form_with url: post_comments_path, scope: "comment", local:true do |form| %>

           <div class="form-group"> 
            <%= form.label :body %>
            <%= form.text_area :body, :class => "form-control-lg" %>
            </div>
            <div class="form-group">
            <%= form.hidden_field :user_id, :value =>current_user.id %>
            <%= form.hidden_field :post_id, :value => @post.id %>
            <%= form.hidden_field :commentable_id, :value => @comment.id %>
            <%= form.hidden_field :commentable, :value => @comment.body %>
            </div>

            <%= form.submit %>
        <% end %>
</div>

Модель комментариев

class Comment < ApplicationRecord
  belongs_to :post
  belongs_to :user
  belongs_to :commentable, polymorphic: true
  has_many :comments, as: :commentable
  paginates_per 5

end

Контроллер комментариев:

def create
    @post = Post.find(params["post_id"])

    user_id = comment_params["comment"]["user_id"]
    body = comment_params["comment"]["body"]

    @comment = Comment.new(post_id: @post.id, user_id: user_id, body: body )

    if @comment.save
      redirect_to post_path(@post), method: :patch, notice: 'Reply successfully created.'
    else
      redirect_to post_path(@post), notice: @comment.errors.messages

    end
  end

 def comment_params
    params.permit(:post_id, comment: [:user_id, :body] )
  end

Ошибка, которую я получаю, когда пытаюсь оставить комментарий:

Журналы сервера:

Started GET "/posts/1" for 127.0.0.1 at 2018-09-27 16:33:56 -0400
Processing by PostsController#show as HTML
  Parameters: {"id"=>"1"}
  Post Load (0.2ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/posts_controller.rb:40
  Rendering posts/show.html.erb within layouts/application
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 143], ["LIMIT", 1]]
  ↳ app/controllers/application_controller.rb:21
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 19], ["LIMIT", 1]]
  ↳ app/views/posts/show.html.erb:45
   (0.4ms)  SELECT COUNT(*) FROM "comments" WHERE "comments"."commentable_id" = $1 AND "comments"."commentable_type" = $2  [["commentable_id", 1], ["commentable_type", "Post"]]
  ↳ app/views/posts/show.html.erb:49
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 19], ["LIMIT", 1]]
  ↳ app/views/posts/show.html.erb:49
  CACHE User Load (0.0ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 19], ["LIMIT", 1]]
  ↳ app/views/posts/show.html.erb:54
  Comment Load (0.4ms)  SELECT "comments".* FROM "comments" WHERE "comments"."commentable_id" = $1 AND "comments"."commentable_type" = $2  [["commentable_id", 1], ["commentable_type", "Post"]]
  ↳ app/views/posts/show.html.erb:71
  Rendered posts/show.html.erb within layouts/application (11.8ms)
Completed 200 OK in 49ms (Views: 42.8ms | ActiveRecord: 1.7ms)

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

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Прежде всего, у вас есть уязвимость в приведенном выше коде: <%= form.hidden_field :user_id, :value =>current_user.id %> это не нужно.Пожалуйста, возьмите текущего пользователя из сеанса вместо этого в контроллере.С помощью приведенного выше кода можно изменить идентификатор пользователя в представлении и отправить его, чтобы комментарий был прикреплен к другому пользователю.

Следующее, что я вижу, это следующее:

<%= form.hidden_field :commentable, :value => @comment.body %>

commentable это ваше отношение, почему вы назначаете там тело комментария?это должно быть commentable_type, а значение должно быть именем класса комментария, таким образом: <%= form.hidden_field :commentable_type, :value => @comment.class.name %>

В вашем контроллере вы не назначаете комментируемый объект, поэтому проверка завершается неудачно, так как требуется комментарий.

Более того, поскольку вы решили сделать комментарий полиморфным, вам больше не нужна ссылка на пост.Вам нужно только сохранить ссылку на комментарий.

У GoRails должен быть отличный пример, мне действительно нравится инструктор (Крис Оливер).Вы можете проверить это здесь: https://gorails.com/episodes/comments-with-polymorphic-associations

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

0 голосов
/ 28 сентября 2018

Попытайтесь добавить optional: true

class Comment < ApplicationRecord
 belongs_to :commentable, polymorphic: true, optional: true

В Rails 5 всякий раз, когда мы определяем ассоциацию own_to, требуется, чтобы связанная с ней запись присутствовала по умолчанию после этого изменения.

Читать это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...