Eu tenho uma pergunta em duas partes sobre form_for e recursos aninhados. Digamos que estou escrevendo um mecanismo de blog e quero relacionar um comentário a um artigo. Eu defini um recurso aninhado da seguinte maneira:
map.resources :articles do |articles|
articles.resources :comments
end
O formulário de comentários está na exibição show.html.erb dos artigos, abaixo do próprio artigo, por exemplo:
<%= render :partial => "articles/article" %>
<% form_for([ :article, @comment]) do |f| %>
<%= f.text_area :text %>
<%= submit_tag "Submit" %>
<% end %>
Isso gera um erro, "ID chamado para zero, o que seria errado etc." Eu também tentei
<% form_for @article, @comment do |f| %>
Que processa corretamente, mas relaciona f.text_area ao campo 'text' do artigo, em vez do comentário, e apresenta o html para o atributo article.text nessa área de texto. Então, parece que eu também entendi errado. O que eu quero é um formulário cujo 'submit' chame a ação create no CommentsController, com um article_id nos parâmetros, por exemplo, uma solicitação de postagem para / articles / 1 / comments.
A segunda parte da minha pergunta é: qual é a melhor maneira de criar a instância do comentário? Estou criando um comentário @ na ação show do ArticlesController, para que um objeto de comentário esteja no escopo do auxiliar form_for. Em seguida, na ação create do CommentsController, crio um novo @comment usando os parâmetros fornecidos no form_for.
Obrigado!
fonte
[@result, @course]
trabalhou, masform_for(@result, url: { action: "create" })
também funciona. Isso precisa apenas do último nome do modelo e do nome do método.Certifique-se de ter os dois objetos criados no controlador:
@post
e@comment
para a postagem, por exemplo:Então, em vista:
Certifique-se de definir explicitamente a matriz no form_for, não apenas com vírgula, como você tem acima.
fonte
Você não precisa fazer coisas especiais no formulário. Você acabou de criar o comentário corretamente na ação show:
e crie um formulário para ele na exibição do artigo:
por padrão, esse comentário irá para a
create
ação deCommentsController
, na qual você provavelmente desejaráredirect :back
inserir, para que seja roteado de volta àArticle
página.fonte
form_for([@article, @new_comment])
formato. Eu acho que é porque eu estou mostrando a visãocomments#new
, nãoarticle#new_comment
. Eu acho que noarticle#new_comment
Rails é inteligente o suficiente para descobrir o que o objeto de comentário está aninhado e, portanto, você não precisa especificá-lo?