Mam dwuczęściowe pytanie dotyczące form_for i zagnieżdżonych zasobów. Powiedzmy, że piszę silnik bloga i chcę powiązać komentarz z artykułem. Zdefiniowałem zagnieżdżony zasób w następujący sposób:
map.resources :articles do |articles|
articles.resources :comments
end
Formularz komentarza znajduje się w widoku show.html.erb dla artykułów, pod samym artykułem, na przykład w ten sposób:
<%= render :partial => "articles/article" %>
<% form_for([ :article, @comment]) do |f| %>
<%= f.text_area :text %>
<%= submit_tag "Submit" %>
<% end %>
Daje to błąd „Called id for nil, co mogłoby być błędne itd.” Ja też próbowałem
<% form_for @article, @comment do |f| %>
Który renderuje się poprawnie, ale łączy f.text_area z polem „text” artykułu zamiast komentarza i przedstawia kod HTML atrybutu article.text w tym obszarze tekstowym. Więc wydaje mi się, że to też się mylę. To, czego chcę, to formularz, którego 'wyślij' wywoła akcję tworzenia w CommentsController, z parametrem article_id, na przykład żądanie wpisu do / article / 1 / comments.
Druga część mojego pytania brzmi: jaki jest najlepszy sposób na utworzenie wystąpienia komentarza na początek? Tworzę @comment w akcji show elementu ArticlesController, więc obiekt komentarza będzie w zakresie pomocnika form_for. Następnie w akcji tworzenia w CommentsController tworzę nowy @comment, używając parametrów przekazanych z form_for.
Dzięki!
źródło
[@result, @course]
działał, aleform_for(@result, url: { action: "create" })
też działa. Potrzebna jest tylko ostatnia nazwa modelu i nazwa metody.Upewnij się, że w kontrolerze zostały utworzone oba obiekty:
@post
i@comment
dla postu, np .:Następnie na widoku:
Upewnij się, że jawnie zdefiniowałeś tablicę w form_for, a nie tylko oddzielonych przecinkami, jak powyżej.
źródło
Nie musisz robić specjalnych rzeczy w formularzu. Po prostu poprawnie budujesz komentarz w akcji show:
a następnie utwórz dla niego formularz w widoku artykułu:
Domyślnie ten komentarz przejdzie do
create
czynnościCommentsController
, którą prawdopodobnie zechcesz umieścićredirect :back
, abyś został przekierowany z powrotem naArticle
stronę.źródło
form_for([@article, @new_comment])
formatu. Myślę, że to dlatego, że pokazuję widokcomments#new
, a niearticle#new_comment
. Wydaje mi się, że warticle#new_comment
Railsach jest wystarczająco inteligentny, aby dowiedzieć się, w czym jest zagnieżdżony obiekt komentarza, a więc nie musisz go określać?