Rails associations (belongs_to, has_many) ne pouvez pas enregistrer 2 ids dans la table avec une méthode de création (utilisateur, après, commentaire)

StackOverflow https://stackoverflow.com/questions/3732198

Question

Essayer d'écrire une application de base « comme blog » dans des rails 3, je suis coincé avec les associations. J'ai besoin de créer la méthode de sauvegarde post_id ainsi que la user_id dans la table de commentaire (que je besoin pour retrive tous les commentaires écrits par un utilisateur afin de l'afficher)

L'application a des utilisateurs (authentification -), messages Concevoir (publiés par les utilisateurs - mais je ne suis pas sûr qu'il importe dans mon cas) et des commentaires (sur les messages, publiés par les utilisateurs)

.

la table de commentaire a une post_id, un corps, et aussi un user_id

Associations:

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)

les itinéraires suivants:

resources :posts do
  resources :comments
end

resources :users do
  resources :comments
end

Le formulaire post commentaire affiché sur les messages afficher la vue: (messages / show.html.erb)

<% form_for [@post, Comment.new] do |f| %>
  <%= f.label :body %>
  <%= f.text_area :body %>
  <%= f.submit %>
<% end %>

et enfin, créer la méthode dans le contrôleur de commentaires:

.) Si j'écris un post_id est écrit dans la base de données

def create
  @post = Post.find(params[:post_id])
  @comment = @post.comments.create!(params[:comment])
  redirect_to @post
end

B.) Si j'écris un user_id est écrit ...

def create
  @user = current_user
  @comment = @user.comments.create!(params[:comment])
  redirect_to @post
end

J'ai essayé:

@comment = @post.comments.create!(params[:comment].merge(:user => current_user))

Mais il ne fonctionne pas .. Comment puis-je écrire une méthode qui permettent d'économiser l'user_id et post_id? Est-ce que je dois aussi faire un changement dans le commentaire sous forme de poste (quelque chose comme <% form_for [@post, @user, Comment.new] do | f |%>?)

Merci!

Était-ce utile?

La solution

Pour mettre en place quelque chose de très similaire, je l'ai utilisé sous la forme suivante:

<%= form_for [:place, @comment] do |f| %>
  #form fields here
<%= end %>

Ensuite, dans le contrôleur de commentaires:

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

end

Cela devrait construire les associations correctement, espérons! En passant, voulez-vous dire des commentaires à imbriquer dans: les utilisateurs dans vos itinéraires? Si vous voulez juste pour afficher tous les commentaires de l'utilisateur sur une page de profil, vous pouvez faire quelque chose comme:

<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 une partie de cette aide!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top