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
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 .
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ą)
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
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