Это мое первое приложение на 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