2009-11-20 23 views
7

Çok sayıda kaydı bir kerede güncellemek istediğim bir durumla karşılaştım - GMail, "read" (okuma) veya "read" (okunmamış) mesajlarını ayarlamak gibi.Raylar Restful actions Endeks Koymak

Raylar bir ActiveRecord sınıfına 'güncelleme' yöntemi ile bu teşvik - Comment.update (anahtarlar, değerler)

Örnek - http://snippets.dzone.com/posts/show/7495

bu büyük işlevsellik, ancak sert dinlendirici rotaya haritasına etmektir . Bir bakıma şunu görmek isterdim: Bir koleksiyon üzerinde harekete geçmek. yolları, biz formda sonra

map.resources :comments, :collection => { :update_many => :put } 

gibi bir şey eklemek Ve yapabilirsiniz, bu pek çok düzeyde çalışmıyor

<% form_for @comments do |f| %> 
    ... 

... Bu yapardım. Bunu yaparsanız:: collection => {: update_many =>: put}, raylar dizin eylemine bir gönderi gönderecek (CommentsController # index), 'update_many' eylemine gitmek istiyorum. Bunun yerine, şunları yapabilirsiniz: collection => {: update_many =>: post}. Bu, en azından kontrol cihazında doğru harekete geçecektir. @comments için

Ve yerine <% formu ... aşağıdakileri yapmanız gerekir:

<% form_for :comments, :url => { :controller => :comments, :action => :update_many } do |f| %> 

Tamam bu şekilde Hala

mükemmel değil çalışacaktır - biz gibi küçük hissediyor 'Raylar yolu' yapmıyoruz. Ayrıca, şu şekilde görünüyor: gönderi ve: sil, koleksiyon denetleyicisinde de anlamlı olur.

Bunu kurmak için kaçırdığım bir şey olup olmadığını görmek için burada gönderiyorum. Bir toplama seviyesinde nasıl rahatça yapılacağına dair başka düşünceleriniz: gönder,: koy,: sil?

+0

ben cevabım şu sorunuzu ilham sorununa başka bir çözüm sağlıyordu biliyoruz. Bunu yansıttım. – EmFi

cevap

1

Sık sık koleksiyon tabanlı update_multiple ve destroy_multiple eylemlerini başka bir RESTful denetleyicisine eklerim.

Onay Kutuları Üzerinden Güncelleme hakkında bu Railscast göz atın. Sorunlara nasıl giderseniz, ona nasıl yaklaşacağınızı, geri gelip bu soruyu nasıl ekleyeceğinizi iyi bir fikir vermelisiniz!

+0

Bunun için teşekkürler - 'form_for' kullanarak işe yaramaz gibi görünüyor: koymak eylem. 'Form_tag' konumuna geçtiğimde (Ryan B. gösterdiği gibi), şimdi doğru eyleme geçiyor ve doğru çalışıyor. Nedenini anlamaya çalışmadım. Küçük bir şey - 'records_for' bloğunu kullanarak her kayıt için giriş alanlarını (f.text_field) oluşturmaktan hoşlanırım. Ryan, onun screencast'ında fields_for'unu kullanmaz (belki de yardımcıdan önce gelir) ve _tag yöntemlerini kullanır. 'fields_for' burada kullanmak için Tamam. İletiler kullanıcının bir alt kaynağıysa, – Swards

2

Açıkladığınız gibi birkaç duruma rastlıyorum. İlk birkaç kez, önerdiğinize hemen hemen aynı formu uyguladım.

Üçüncü kez bu sorunla karşılaştığımda, güncelleştirdiğim her öğenin ortak bir belongs_to ile başka bir ilişkisi olduğunu fark ettim. Genellikle bir kullanıcı. Tam olarak bu RESTLE anlamında ihtiyacınız olan epiphany. Ayrıca, formu/denetleyiciyi temizlemenize yardımcı olur. Bir grup iletiyi güncelleştirmeyi bir kullanıcı olarak güncelleştirmeyi düşünmüyor gibi düşünmeyin.

Aşağıda, farkı vurgulamak için geçmişte kullandığım bir örnek kod var.

rayların 2.3 itibariyle kullanım modeline

accepts_nested_attributes_for :messages 

ekleyebilir ... biz örnein ait iletilerde toplu işlemler istediğinizi varsayarsak. Messages_attributes öğesinin attr_accessible öğesinin parçası olduğundan veya attr_protected değerinden olmadığından emin olun.

map.resources :users, :member => {:bulk_message_update, :method => :put} 

Sonra kontrolöre eylemi ekleyin:

Sonra rota oluşturmak. AJAX yetenekleri ile;)

def bulk_message_update 
    @user = User.find(params[:id]) 
    @user.update_attributes(params[:user]) 
    if @user.save 
    respond_to do |format| 
     format.html {redirect} 
     format.js {render :update do |page| 
      ... 
     } 
    end  
    else 
    .... 
end 

Sonra formu aşağıdaki gibi görünecektir:

<% form_for current_user, bulk_message_update_user_url(current_user), 
    :html => {:method => :put} do |f| %> 
    <% f.fields_for :messages do |message| %> 
    form for each message 
    <% end %> 
    <%= sumbit_tag %> 
<% end %> 
+1

, bunun yerine PUT/kullanıcı/123/iletileri yapmak uygun görünmektedir. ne düşünüyorsun? –