Rails Verbände (belongs_to, has_many) nicht speichern 2-IDs in der Tabelle mit einer create-Methode (Benutzer, Post, Kommentar)
-
03-10-2019 - |
Frage
Der Versuch, eine grundlegende „Blog-like“ App in Schienen zu schreiben 3, ich bin mit den Verbänden stecken. Ich brauche die Methode speichert die post_id erstellen sowie die user_id in der Kommentartabelle (die ich brauche, um alle Kommentare von einem Benutzer geschrieben, um retrive es anzuzeigen)
Die App haben Benutzer (Authentifizierung - devise), Beiträge (von Nutzern geschrieben - aber ich bin nicht sicher, zählt es in meinem Fall) und Kommentare (an dem Pfosten, die von Nutzern)
.Kommentar Tabelle hat eine post_id, einen Körper, und auch ein user_id
Verbände:
has_many :comments (In the Post model)
belongs_to :post (In the Comment model)
belongs_to :user (In the Comment model)
has_many :comments (In the User model)
die Strecken:
resources :posts do
resources :comments
end
resources :users do
resources :comments
end
Das Kommentar Post-Formular angezeigt auf dem Pfosten zeigt Ansicht: (Beiträge / show.html.erb)
<% form_for [@post, Comment.new] do |f| %>
<%= f.label :body %>
<%= f.text_area :body %>
<%= f.submit %>
<% end %>
und schließlich die create-Methode in den Kommentaren Controller:
A). Wenn ich dies schreibe eine post_id in der Datenbank
geschriebendef create
@post = Post.find(params[:post_id])
@comment = @post.comments.create!(params[:comment])
redirect_to @post
end
B). Wenn ich dies schreibe ein user_id geschrieben ...
def create
@user = current_user
@comment = @user.comments.create!(params[:comment])
redirect_to @post
end
Ich habe versucht:
@comment = @post.comments.create!(params[:comment].merge(:user => current_user))
Aber es funktioniert nicht .. Wie kann ich eine Methode schreiben, die die user_id und die post_id retten? Habe ich habe auch einige Veränderungen in der Kommentar Post Form (so etwas wie <% form_for [@post, @user, Comment.new] tun | f |%>?) Zu tun
Danke!
Lösung
etwas sehr ähnliches einzurichten, habe ich das folgende Formular verwendet:
<%= form_for [:place, @comment] do |f| %>
#form fields here
<%= end %>
Dann im Kommentar Controller:
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(params[:comment])
@comment.user = User.find(current_user.id)
respond_to do |format|
if @comment.save
format.html { redirect_to(@comment.post, :notice => 'Comment was successfully created.') }
else
format.html { render :action => "new" }
end
end
Ende
Das sollte die Verbände bauen hoffentlich richtig! Nebenbei bemerkt, meinen Sie für Kommentare unter verschachtelt werden: Benutzern in Ihren Routen? Wenn Sie nur alle des Benutzers Kommentare auf einer Profilseite angezeigt werden soll, könnten Sie so etwas wie tun:
<p>
<b>Comments</b>
<% if @user.comments.empty? %>
No comments to display yet...
<% else %>
<% @user.comments.each do |comment| %>
<p>
<%= link_to "#{comment.post.title}", post_path(comment.post_id) %>, <%= comment.created_at %>
<%= simple_format comment.content %>
</p>
<% end %>
<% end %>
</p>
Hope einige das hilft!