Как создать форму комментария с вложенными маршрутами? (/: Имя пользователя / сообщения /: post_id / комментарии) - PullRequest
0 голосов
/ 13 июня 2019

Это мое первое приложение на Rails.Я пытаюсь создать блог с пользователями, постами и комментариями.Я уже создал пользователей и посты, но у меня возникли проблемы с работой формы комментариев.Я использую помощник form_for, и мои комментарии вложены в область: имя пользователя и ресурсы для сообщений.Я получаю сообщение об ошибке:

Не найдено ни одного маршрута {: action => "index",: controller => "comments",: id => "1",: username => #}, отсутствуют обязательные ключи: [: post_id]

Похоже, он не находит имя пользователя из current_user или post_id из сообщения.Я проверил свой schema.rb, и в моей таблице сообщений есть столбец post_id.Я почти уверен, что просто что-то неправильно вызываю.

Форма моих комментариев: app / views / comments / _form.html.erb

<h3> Add Comment </h3>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <%= f.error_messages %>

  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

rout.rb

Rails.application.routes.draw do
    root 'sessions#new'

    resources :users

    resources :sessions, only: [:new, :create, :destroy]

    scope ':username' do
    resources :posts, except: [:create] do
      resources :comments
      end
    end

    scope ':username' do
    resources :admin, only: [:index]
    end

    post '/:username/posts', to: 'posts#create', as: 'user_posts'
    get 'signup', to: 'users#new', as: 'signup'
    get 'login', to: 'sessions#new', as: 'login'
    get 'logout', to: 'sessions#destroy', as: 'logout'
    get '/:username/admin', to: 'admin#index', as: 'admin'

end

user.rb

class User < ApplicationRecord
  has_many :posts

  has_secure_password

  validates :email, presence: true, uniqueness: true

  has_one_attached :avatar

end

post.rb

class Post < ApplicationRecord
belongs_to :user
has_many :comments

end

comment.rb

class Comment < ApplicationRecord
  belongs_to :post
end

posts_controller.rb

class PostsController < ApplicationController

  def index
    @posts = Post.all
  end

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

  @comment = @post.comments.new
  end

  def new
    @post = Post.new

  end

  def create
    @post = current_user.posts.new(post_params)
    if (@post.save)
      redirect_to posts_path
    else
      render 'new'
    end
  end

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

  end

  def update
    @post = Post.find(params[:id])
    if (@post.update(post_params))
      redirect_to post_path(current_user.username, @post)
    else
      render 'edit'
    end
  end

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

    redirect_to posts_path
  end

  private def post_params
    params.require(:post).permit(:title, :body)
  end
end

comments_controller.rb

class CommentsController < ApplicationController
  def new
    @comment = Comment.new
  end

  def create
    @post = current_user.post.find(params[:id])
    @comment = @post.comments.build(comment_params)
    redirect_to user_post_path(@post)
  end

  private
  def comment_params
    params.require(:comment).permit(:username, :body)
  end
end

...