Добавить комментарий к пользовательским и почтовым моделям (Ruby on Rails)
Я новичок в Rails. Я создаю свое первое приложение-простой блог. У меня есть пользовательские и почтовые модели, где каждый пользователь может писать много сообщений. Теперь я хочу добавить модель комментариев, где каждый пост может иметь много комментариев, а также каждый пользователь может комментировать любой пост, созданный любым другим пользователем.
В комментарии модели у меня
id body user_id post_id
столбцы.
Ассоциации моделей:
пользователей.rb
has_many :posts, dependent: :destroy
has_many :comments
пост.rb
has_many :comments, dependent: :destroy
belongs_to :user
комментарий.rb
belongs_to :user
belongs_to :post
Итак, как правильно определить действие create в CommentsController? Спасибо.
обновление:
маршруты.rb
resources :posts do
resources :comments
end
comments_controller.rb
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(comment_params)
if @comment.save
redirect_to @post
else
flash.now[:danger] = "error"
end
end
результат
--- !ruby/hash:ActionController::Parameters
utf8: ✓
authenticity_token: rDjSn1FW3lSBlx9o/pf4yoxlg3s74SziayHdi3WAwMs=
comment: !ruby/hash:ActionController::Parameters
body: test
action: create
controller: comments
post_id: '57'
как мы видим, он не отправляет user_id и работает, только если я удаляю validates :user_id, presence: true
строка с комментарием.rb
какие предложения?
3 ответов
на вашем пути вы должны поставить это:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(comment_params)
@comment.user_id = current_user.id #or whatever is you session name
if @comment.save
redirect_to @post
else
flash.now[:danger] = "error"
end
end
а также вы должны удалить user_id из comment_params как сильные параметры . Надеюсь, это поможет вам .
Ассоциации
чтобы дать вам определение того, что здесь происходит, вы должны помнить, когда вы создаете запись, вы в основном заполнение базы данных. Ваши ассоциации определяются с foreign_keys
когда вы спросите, Как " добавить комментарии к User
и Post
модель " - суть в том, что вы этого не делаете; вы добавляете комментарий к Comment
модель, и может связать ее с User
и Post
:
#app/models/comment.rb
Class Comment < ActiveRecord::Base
belongs_to :user
belongs_to :post
end
это побуждает Rails искать user_id
и post_id
на Comment
модель по умолчанию.
это означает, что если вы хотел чтобы создать комментарий напрямую, вы можете связать его с любой из этих ассоциаций, просто заполнив foreign_keys
Как вы хотите (или использовать объекты Rails для их заполнения)
поэтому, когда вы хотите сохранить comment
, вы можете этого:
#app/controllers/comments_controller.rb
Class CommentsController < ApplicationController
def create
@comment = Comment.new(comment_params)
end
private
def comment_params
params.require(:comment).permit(:user_id, :post_id, :etc)
end
end
наоборот, вы можете обработайте его с помощью стандартных объектов Rails (как указано в принятом ответе)
Class CommentsController < ApplicationController
before_action :set_user
before_action :set_post
def create
@comment = @post.comments.create(comment_params)
if @comment.save
redirect_to @post
else
flash.now[:danger] = "error"
end
end
private
set_post
@post = User.posts.find(params[:post_id])
end
set_user
@user = User.find(params[:user_id])
end
comment_params
params[:comment].permit()
end