Добавить комментарий к пользовательским и почтовым моделям (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