2016-06-07 3 views
0

Je veux configurer mes modèles, tels que mes messages has_many Commentaires et commentaires has_many Replies. Les commentaires fonctionnent bien. Mais mon application commence à se rompre en disantméthode undefined `model_name 'pour les routes imbriquées

undefined method `model_name' for "/posts/adas/comments/11/replies":String 

lorsque j'essaie de configurer les réponses pour les commentaires. Je n'arrive pas à comprendre ce qui déclenche cette erreur. Je peux ajouter des réponses à partir de ma console Rails et les voir dans la vue, mais l'ajout de la balise form_for casse le code. Quelqu'un peut-il s'il vous plaît indiquer quelle est l'erreur et comment je devrais l'acheminer?

Messages # show.html.erb

<h2>Comments</h2> 
<% @post.comments.each do |comment| %> 
    <p> 
    <b><%= comment.username %></b> 
    <%= comment.name %> 
    <% if current_user.email == comment.username || current_user.admin? %> 
     <%= link_to 'Delete', [comment.post, comment], 
     :confirm => 'Are you sure?', :method => :delete %> 
    <% end %> 
    <p style = "text-indent: 3em"> 
     <% comment.replies.each do |reply| %> 
      <i><%= reply.author %></i> 
      <%= reply.content %> 
     <% end %> 
<%= form_for [@reply, post_comment_replies_path(@post, comment)] do |f| %> 
     <%= f.label :reply %> 
     <%= f.text_field :content %> 
     <%= f.submit("Reply") %> 
    <% end %> 
<% end %> 
</p> 
</p> 
<h3>Add a comment:</h3> 
<%= form_for([@post, @post.comments.build]) do |f| %> 
<%= f.label :comment %><br /> 
<%= f.text_area :name %> 
<%= f.submit %> 
<% end %> 

replies_controller.rb

class RepliesController < ApplicationController 
    def create 
     @reply = @comment.replies.create(reply_params) 
     redirect_to post_path(@post) 
    end 
    private 
     def reply_params 
     params.require(:reply).permit(:content) 
     end 
    end 

routes.rb

Rails.application.routes.draw do 
    devise_for :users, :controllers => { :omniauth_callbacks => "callbacks" } 
    root 'welcome#index' 
    resources :posts do 
    resources :comments do 
     resources :replies 
    end 
    member do 
     put "like", to: "posts#upvote" 
    end 
    end 
end 

Répondre

0

Vous y êtes presque, mais vous n'êtes pas passer les paramètres de la bonne manière pour obtenir le résultat que vous voulez. Au moment où vous passez dans une chaîne d'URL où les rails attend un objet de ressource, d'où l'exception de méthode non définie.

form_for (enregistrement, options = {}, bloc &)

La méthode prend un enregistrement et un hachage d'options qui sont facultatives.

La ligne suspect est

<%= form_for [@reply, post_comment_replies_path(@post, comment)] do |f| %> 

Les crochets ne doivent être utilisés pour définir une ressource et ses ressources associées qui sont ensuite utilisées pour générer un chemin d'URL. Vous devez également indiquer explicitement votre URL dans le hash d'options, à moins que cela ne puisse être déduit des ressources que vous transmettez à form_for. Donc, cela devrait ressembler à ceci, en restant dans la façon dont vous faites les choses.

<%= form_for @reply, url: post_comment_replies_path(@post, comment) do |f| %> 

C'est le cas si vous souhaitez spécifier une URL dans form_for. Cependant, pourquoi ne laissez-vous pas juste les rails pour générer l'URL pour vous?

<%= form_for [@post, comment, @reply] do |f| %> 

De cette façon, les rails doivent gérer les itinéraires.

+0

'<% = form_for @reply, url: post_comment_replies_path (@post, commentaire) do | f | %> ' donne la même erreur. Et '<% ​​= form_for [@post, commenter, @répéter] faire | f | %> 'dit que le premier argument ne peut pas être vide. –