SORU
9 Ocak 2010, CUMARTESİ


form_for iç içe kaynaklarla

Form_for ve iç içe kaynaklar hakkında iki soru var. Hadi bir blog motoru yazıyorum ki ve bir makale için yorum ilişkilendirmek istiyorum. Aşağıdaki gibi iç içe geçmiş bir kaynak tanımlanan ettim

map.resources :articles do |articles|
    articles.resources :comments
end

Yorum formunu göster.html.erb mesela bu gibi: maddenin kendisini, altında makaleler için görmenizi sağlar

<%= render :partial => "articles/article" %>
<% form_for([ :article, @comment]) do |f| %>
    <%= f.text_area :text %>
    <%= submit_tag "Submit" %>
<%  end %>

Bu bir hata, yanlış vb. "" nil çağrısında kimliği verir Ayrıca denedim

<% form_for @article, @comment do |f| %>

Hangi işler doğru ama f ile ilgilidir.text_area makale 'metin' alan yerine yorum ve yazı için html sunuyor.metin metin alanında bağlıyor. Bu yanlış var gibi görünüyor. İstediğim bir form olan 'gönder' CommentsController eylem, bu parametreler içinde bir article_id ile oluşturmak arayacak, örneğin bir yazı /makale/1/yorumlar isteği.

Sorumun ikinci bölümü, açıklama ile başlamak için örnek oluşturmak için en iyi yolu nedir? Bu ArticlesController @gösteride bir açıklama aksiyon yaratıyorum, bir açıklama nesnesi form_for yardımcı kapsam içinde olacak. Sonra CommentsController eylem oluştur, @yorum parametreler kullanarak form_for geçirilen yeni bir ben yaratmak.

Teşekkürler!

CEVAP
6 Ocak 2011, PERŞEMBE


Travis R doğrudur. (Ya upvote isterdim.) Ben sadece kendim çalışıyor. Yolları: bu

resources :articles do
  resources :comments
end

Yollar gibi olsun:

/articles/42
/articles/42/comments/99

en denetleyicileri yönlendirilmiş

app/controllers/articles_controller.rb
app/controllers/comments_controller.rb

özel bir ad ile http://guides.rubyonrails.org/routing.html#nested-resources, öyle diyor.

Ama giriş ve formlar zor olur. Not köşeli parantez:

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

Eğer URİ istiyorsanız en önemlisi, böyle bir şeye ihtiyaç duyabilirsiniz.

article_comment_path(@article, @comment)

Alternatif olarak:

[@article, @comment]

http://edgeguides.rubyonrails.org/routing.html#creating-paths-and-urls-from-objects belirtildiği gibi

comment_item kısmi bir koleksiyon içinde örneğin, yineleme için sağlanan

<%= link_to "delete", article_comment_path(@article, comment_item),
      :method => :delete, :confirm => "Really?" %>

Jamuraa ne diyor Madde kapsamında işe yarayabilir, ama çeşitli şekillerde benim için işe yaramadı.

Bir çok tartışma iç içe kaynaklar, örneğin http://weblog.jamisbuck.org/2007/2/5/nesting-resources ile ilgilidir

İlginçtir, ben sadece insanların çoğu birim-testleri olduğunu öğrendim aslında tüm yollar test değildir. İnsanlar jamisbuck önerisi takip ettiğinizde, onlar iç içe kaynaklara ulaşmak için iki yol. Birim testleri genellikle/alacak onların basit yazı:

# POST /comments
post :create, :comment => {:article_id=>42, ...}

Tercih edebileceklerinin rotayı test etmek için, bu şekilde yapmak gerekir:

# POST /articles/42/comments
post :create, :article_id => 42, :comment => {...}

Çünkü benim birim testleri bu anahtarlamalı mıyım: başarısız başladı bu öğrendim

resources :comments
resources :articles do
  resources :comments
end

bunun için:

resources :comments, :only => [:destroy, :show, :edit, :update]
resources :articles do
  resources :comments, :only => [:create, :index, :new]
end

Tamam yinelenen yollar, ve bir kaç bayan için birim testleri var sanırım. (Neden test? Eğer kullanıcı hiç çoğaltır görürse bile, formları onlara, dolaylı olarak ya da yolları adlı ile de ilgili olabilir.) Yine de, gereksiz yere tekrarını en aza indirmek için bunu tavsiye ederim:

resources :comments
resources :articles do
  resources :comments, :only => [:create, :index, :new]
end

Uzun cevap için özür dilerim. Değil birçok kişi inceliklerini farkında bence.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jaclyn W

    Jaclyn W

    5 Mayıs 2006
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008
  • Utah Valley Online

    Utah Valley

    9 AĞUSTOS 2010