Dodaj komentarz do Modeli użytkowników i postów (Ruby on Rails)

Jestem nowy w Rails. Buduję swoją pierwszą aplikację-prosty blog. Mam modele User I Post, gdzie każdy użytkownik może napisać wiele postów. Teraz chcę dodać Model komentarza, w którym każdy post może mieć wiele komentarzy, a także każdy użytkownik może komentować każdy post utworzony przez dowolnego innego użytkownika.
W komentarzu model mam

id \ body \ user_id \ post_id

Kolumny.
Stowarzyszenia modelowe:
użytkownik.rb

has_many :posts,    dependent: :destroy
has_many :comments

Poczta.rb

has_many :comments, dependent: :destroy
belongs_to :user

Skomentuj.rb

belongs_to :user
belongs_to :post

Więc jak mam poprawnie zdefiniować create action w CommentsController? Dziękuję.

UPDATE:
trasy.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

Wynikiem jest

--- !ruby/hash:ActionController::Parameters
utf8: ✓
authenticity_token: rDjSn1FW3lSBlx9o/pf4yoxlg3s74SziayHdi3WAwMs=
comment: !ruby/hash:ActionController::Parameters
  body: test
action: create
controller: comments
post_id: '57'

Jak widać nie wysyła user_id i działa tylko wtedy, gdy usunę validates :user_id, presence: true string z komentarza.rb

Jakieś sugestie?
Author: Alexander, 2014-06-29

3 answers

Na swój sposób powinieneś umieścić to:

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

A także należy usunąć user_id z comment_params jako silne parametry . Mam nadzieję, że to ci pomoże .

 11
Author: zauzaj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-28 22:12:24

Stowarzyszenia

Aby dać ci definicję tego, co się tutaj dzieje, musisz pamiętać, że za każdym razem, gdy tworzysz rekord, w zasadzie wypełniasz bazę danych. Twoje skojarzenia są zdefiniowane przez foreign_keys

Kiedy pytasz jak "dodawać komentarze do User i Post modelu" - najważniejsze jest to, że tego nie robisz; dodajesz komentarz do Comment modelu i możesz powiązać go z User i Post:

#app/models/comment.rb
Class Comment < ActiveRecord::Base
    belongs_to :user
    belongs_to :post
end

To skłania Rails do szukania user_id i post_id w modelu Comment domyślnie.

Oznacza to, że jeśli chciałeś utworzyć komentarz bezpośrednio, możesz powiązać go z jednym z tych skojarzeń, po prostu wypełniając foreign_keys według własnego uznania (lub używając obiektów Rails do ich wypełnienia)

Więc jeśli chcesz zapisać comment, możesz zrobić to:

#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

Odwrotnie, możesz sobie z tym poradzić używając standardowych obiektów Rails (zgodnie z przyjętą odpowiedzią)

 7
Author: Richard Peck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-29 08:22:20
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
 0
Author: Snehal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-07 09:11:59