2014-07-18 14 views
5

Ho il seguente codice ma non sono in grado di capire come si verifica il routing per form_for ([@ article, @ article.comments.build]). Ruby on Rails Form Per con due parametri

Titolo: <% = @ ARTICLE.TITLE%>

<p> 
     <strong>Text:</strong> 
     <%= @article.text %> 
    </p> 

    <h2>Add a comment:</h2> 
    <%= form_for([@article, @article.comments.build]) do |f| %> 
     <p> 
     <%= f.label :commenter %><br> 
     <%= f.text_field :commenter %> 
     </p> 
     <p> 
     <%= f.label :body %><br> 
     <%= f.text_area :body %> 
     </p> 
     <p> 
     <%= f.submit %> 
     </p> 
    <% end %> 

    <%= link_to 'Back', articles_path %> 
    | <%= link_to 'Edit', edit_article_path(@article) %> 

risposta

3

Rails può implicare il percorso dal form_for

esempio

<%= form_for(@article) do |f| %> 
... 
<% end %> 

Se @article è nuovo e non nel database, quindi le rotaie può dedurre che si sta creando una nuova, quindi il percorso sarebbe

articles_path(@article), action: :create 

Se @article esiste già nel database, allora le rotaie possono dedurre che stai modificando un oggetto esistente, quindi il percorso è.

article_path(@article), action: :update 

Questo vale per le rotte nidificati, così come il codice di esempio che avete.

<%= form_for([@article, @article.comments.build]) do |f| %> 

Si conosce il percorso genitore è l'articolo e il percorso sub è commenti, in quanto si tratta di un nuovo commento, il percorso sarebbe

article_comments_path(@article, @article.comments.build), action: :create 

Se un commento esiste allora sarà un'azione di aggiornamento

article_comment_path(@article, @comment), action: :update 

Qualsiasi form_for, link_to, ecc può implicare il percorso dagli oggetti.

+0

Davvero una buona spiegazione. – Niyanta

2

Per fare ciò, è necessario che i commenti vengano annidati sotto il tuo articolo. Così il vostro file di rotta avrebbe qualcosa di simile

resources :article 
    resources :comments 
end 

Questo crea diversi percorsi, quello questa forma sarebbe andato è

POST /posts/:post_id/comments 

E nel aiutante form_for form_for([@article, @article.comments.build]) dice al modulo per inviare a quella rotta