2009-05-10 7 views
2

Je crée un site de critique de livre très simple et il a besoin de la capacité de permettre à l'utilisateur d'ajouter des petits commentaires au sujet d'un livre. Maintenant, j'ai mes deux tables, une pour le livre et une pour les commentaires et j'ai maintenant besoin d'un moyen de transférer des données entre les deux parce que je trouve la façon dont les rails manipule les choses assez curieux.Transfert des variables entre les modèles en utilisant une vue

donc mon modèle de livre contient « has_many: commentaires » et moi de commenter le modèle a: « belongs_to: livre »

la vue que je suis en utilisant à la fois vue et ajouter des commentaires est «/views/livre/ViewBook. html.erb « cela montre le livre et tous ses détails, au fond est une section où l'utilisateur peut ajouter leurs propres commentaires, il ressemble à ceci:

 
    <%= form.text_field :title %> 
    <%= form.text_area :body %> 
    <%= submit_tag "Add Comment", :class => "submit" %> 

maintenant je sais que ce ne peut pas fonctionner parce que ci-dessus » : title "et": body "seraient dans le modèle du livre mais j'ai besoin qu'ils soient envoyés au modèle de commentaire car ils sont dans le DB de commentaire. Comment puis-je transmettre ces données à la base de données de commentaires? J'ai essayé ": comment.title" et d'autres choses différentes, mais ne peut toujours pas travailler sur comment transmettre ces données.

Toutes les pensées seraient grandement appréciées.

(Excusez-moi si cette question est très stupide ou n'a pas été expliqué bien, mon professeur régler cette mission et les rails n'est pas une langue que j'ai jamais utilisé.)

Répondre

2

Vous définissez ce que la forme est dans la balise form d'ouverture:

<% form_for :comment do |form| %> 

    <%= form.text_field :title %> 
    <%= form.text_area :body %> 

    <%= submit_tag "Add Comment", :class => "submit" %> 

<%= end %> 

L'idée est que la forme est un objet de commentaire vide. Les contrôleurs communiquent entre les modèles et les vues, de sorte que votre contrôleur doit avoir une action pour traiter le formulaire qui sait enregistrer l'objet de commentaire dans le modèle de commentaire. Vous souhaiterez également spécifier le livre pour lequel le commentaire est destiné. Il y a beaucoup de façons de gérer cela (champs cachés, ressources RESTful imbriquées, etc.).

Peut-être commencer ici: http://guides.rubyonrails.org/action_controller_overview.html

0

j'ai donc modifié à l'aide de vos excellentes suggestions et maintenant qu'un seul problème est arrivé en place. Alors que je peux maintenant stocker avec succès le titre des commentaires, le corps, le temps et la personne qui a laissé le commentaire à la DB je ne peux toujours pas savoir comment utiliser stocker le book.id. Voici la vue:

<% form_for :comment, :url => { :action => "addcomment" } do |form| %> 
    <%= form.hidden_field :user_id, :value => session[:user_id] %> 
    <%= form.hidden_field :book_id, :value => @book.id %> <!-- WONT WORK --> 
    <%= form.label "Title" %><%= form.text_field :title %><br /> 
    <%= form.label "Comment" %><%= form.text_area :comment %> 
    <%= submit_tag "addComment", :class => "submit" %> 
<% end %> 

Voici mon contrôleur qui peut désormais stocker avec succès les détails, en dehors de la book.id

def addcomment 
    @newcomment = Comment.new(params[:comment]) 
    if @newcomment.save 
    flash[:notice] = "Comment Was Added To The System." 
    redirect_to :action => "index" 
    end 
end 

i bien que « @ book.id » travaillerais parce que dans cette vue, je montre également les détails des livres en utilisant des choses comme "@ book.title" et "@ book.authour" et cela semble fonctionner, mais pas pour le domaine d'identification si.

+0

On dirait que cela devrait fonctionner. Vos associations sont-elles correctement configurées dans vos modèles (has_many et belongs_to)? Peut-être que c'est la sauvegarde de l'information correcte, mais sans les associations correctes, il ne trouve pas ce qu'il devrait. – Jarrod

+0

N'accepte pas l'affichage user_id via le formulaire. Lisez-le de la session lorsque vous enregistrez le commentaire dans la base de données. Sinon, n'importe qui peut soumettre un commentaire comme n'importe qui d'autre. En d'autres termes, vous ne devez pas approuver les données envoyées par le client. – James

0

Ainsi peuvent maintenant poster des commentaires avec succès et de les stocker avec les détails corrects, maintenant im à afficher une liste des commentaires de ce livre en particulier en utilisant la valeur « book_id ».Voici ce que je pensais travailler, j'ai aussi un code comme celui-ci dans la partie de recherche de mon application, donc je pensais que ce serait bien:

def view 
    @book = Book.find(params[:id]) 
    @reviews = Comment.find_by_book_id(@book.id) 
end 

Avec la vue correspondante:

<% if @reviews %> 
    <% for review in @reviews %> 
    <%= form.label "Title: " %><%h review.title %> <br /> 
    <%= form.label "Review:" %><%h review.comment %> 
    <% end %> 
<% end %> 

Maintenant que devrait obtenir les commentaires qui ont le "book_id" du livre que je regarde et l'affichage de chacun en utilisant la boucle for. Doesnt travail tout à fait bien, il crache un message d'erreur indiquant que le suivant:

#undefined method `each' for #<Comment:0xb682c2f4> 
#Extracted source (around line #27) 

Et la ligne 27 est

<% for review in @reviews %> 
0

Pour trouver les commentaires pour un livre, il est juste:

@book = Book.find(params[:id]) 

comme vous l'avez déjà fait, alors:

@book.comments 

pour les commentaires de ce livres. Donc:

<% for review in @book.comments % 
    <%= form.label "Title: " %><%h review.title %> <br /> 
    <%= form.label "Review:" %><%h review.comment %> 
<% end %> 

Vous n'avez pas besoin de trouver les commentaires dans le contrôleur.

Questions connexes