Блог Ruby on Rails и добавление комментариев к сообщениям, редактирование и удаление комментариев - PullRequest
0 голосов
/ 16 сентября 2018

Я работаю над блогом ROR и столкнулся с некоторыми проблемами на этом пути.В настоящее время я изучаю Rails и чувствую себя полностью потерянным, соединяя все части.Я работал над своим разделом комментариев в течение нескольких дней и, наконец, смог создать комментарии к сообщениям, но я не могу редактировать или удалять их.Я также ссылался на вопросы SO ниже, но все еще сталкиваюсь с проблемами.

Вот мой макет:

Параметры модели комментария:

body \ user_id \ post_id

Ассоциации моделей:

user.rb

has_many :posts
has_many :comments

post.rb

belongs_to :user
has_many :comments

comment.rb

belongs_to :user
belongs_to :post

rout.rb:

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

  get '/' => 'users#index'

  get '/posts' => 'posts#index'

  post '/posts/create' => 'posts#new'

  post '/posts/edit' => 'posts#edit'

  get '/signin' => 'sessions#new', as: :new_session
  post '/create-session' => 'sessions#create', as: :create_session
  get 'signout' => 'sessions#destroy', as: :destroy_session

  resources :users

  resources :posts
  resources :comments
end

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

class CommentsController < ApplicationController

  def index
    @comment = Comment.all 
  end

  def new
    user = session[:user_id]
    @comment = Comment.new(post_id: params[:post_id])
    @post = Post.find(params[:post_id])
  end

  def create
    @comment = Comment.new(comment_params)
    @comment.user_id = session[:user_id]
    @postid = params[:id]
    if @comment.save
      flash[:notice] = "comment created."
      redirect_to '/posts'
    else
      flash[:error] = "Error creating comment."
      redirect_to '/posts'
    end
  end

  def edit
    @post = Post.find(params[:id])
  end

  def update
    @comment = Comment.find_by_id(params[:id])
    @comment.update(comment_params)
    flash[:notice] = "Comment updated."
    redirect_to '/posts'
  end

  def destroy
    @comment = Comment.find(params[:comment_id])
    @comment.destroy
    redirect_to '/posts'
  end

  private 

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

Посты show.html.erb в папке views / posts:

<%# show all posts %>

<div id="single-post">
    <h1>User - <%= @post.user.username %></h1>

        <h2>Post -  <%= @post.body %> </h2>

        <%= link_to("Edit Post", edit_post_path(@post)) %>
        </br>
        <%= link_to("Delete Post", @post, method: 'delete') %>
        </br>
        <%= link_to("Add Comment", new_comment_path(post_id: @post.id)) %>
        <%#<%= link_to("Edit Comment", edit_comment_path(post_id: @post.id, comment_id: @comment.id))%>
</div>


    <h3><% @post.comments.reverse.each do |c| %> </h3> 
        <div id="single-comment">
            <h4>Comment</h4>
            <h5>From - <%= c.user.username %></h5>

            <h6><%= c.body %> </h6>

            </br>
            <%= link_to("Edit Comment", edit_comment_path(@post.id)) %>
            </br>
            <%= link_to("Delete Comment", comment_path(@post.id), method: :delete) %>

        </div>
    <% end %>

</div>

new.html.erb в папке views / comments

<div id="comment-form">
    <%= form_for @comment do |f| %>
        <%= f.label :body %>
        <%= f.text_area :body, class: "text-area" %>
        <%= f.hidden_field :post_id %>
        <%= f.submit %>
    <% end %>
</div>

Снова могу добавитькомментарии к постам.При наведении указателя мыши на тег редактирования в комментарии я вижу следующее: localhost: 3000 / comments / 72 / edit

Я вижу эту ошибку, когда нажимаю на edit

error when trying to edit a comment

При наведении курсора на кнопку удаления я вижу следующее: localhost: 3000 / comments / 72

Я вижу эту ошибку, когда нажимаю на delete

error when trying to delete a comment

Я нахожусь в точке, где я полностью потерян и чувствую, что перепробовал все возможное, но, похоже, ничего не работает.Пожалуйста помоги!Вот и репозиторий GitHub: https://github.com/angelr1076/rails-blog

1 Ответ

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

First argument in form cannot contain nil or be empty говорит вам, что @comment в <%= form_for @comment do |f| %> равно nil.Это потому, что в действии edit вашего CommentsController вы устанавливаете @post вместо @comment.

Измените его на:

def edit
  @comment = Comment.find(params[:id])
end

Для удаления комментарияCouldn't find Comment without an ID говорит вам, что значение, которое вы передаете find, равно nil.Это потому, что вы пытаетесь использовать params[:comment_id] вместо params[:id].Измените действие уничтожения на:

def destroy
  @comment = Comment.find(params[:id])
  @comment.destroy
  redirect_to '/posts'
end

Обновление:

Также, согласно вашему коду, вы должны изменить edit и delete ссылки ниже

<%= link_to("Edit Comment", edit_comment_path(c)) %>
<%= link_to("Delete Comment", comment_path(c), method: :delete)

Вы передаете @post.id, который является идентификатором поста.Вместо этого вы должны передать идентификатор комментария, используя переменную блока из вашего comments.each, отметив, что .id здесь не нужен, потому что это может быть выведено Rails.

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