2016-12-20 21 views
6

user ve project modelleriyle ilgili olan task modelim var.Birden çok kahve işlemesi için desen

Bir görev oluşturduğumda/güncellediğimde, yalnızca görev değişikliği/ekleme için değil, proje ve kullanıcı bilgileri için (bu verilerin bir kısmı da değişebileceğinden) görünüm eşzamansızlığında bir güncelleme yapmam gerekiyor./Create.js.coffee

# Update task table 
$('#mytable').append("<%= j render(partial: 'tasks/task', locals: { t: @task }) %>") 

# Update user data 
$('.user-data').html("<%= j render(partial: 'users/user_widget', locals: { u: current_user }) %>") 

# Update project data 
$('.project-data').html("<%= j render(partial: 'projects/project_widget', locals: { p: @project }) %>") 

def create 
    @task = Task.new(params[:task]) 
    @project = Project.find(params[:project_id]) 

    respond_to do |format| 
    if @task.save 
     format.html { redirect_to @task, notice: 'Task was successfully created.' } 
     format.json { render json: @task, status: :created, location: @task } 
    else 
     format.html { render action: "new" } 
     format.json { render json: @task.errors, status: :unprocessable_entity } 
    end 
    end 
end 

Ve görevleri Ve harika çalışır:

ben denetleyicisi bu var. Her yılında

  • ben çok fazla kod tekrarlıyorum, eklemek .js.coffee render: Ben 2 sorunları görüyoruz. Proje ve kullanıcı verilerini güncellemek, görev güncellemelerini, görevleri yıkmak için tam olarak aynı kodu kopyalarım ve kullanıcı ve projeyi etkileyebilecek yeni bir model için aynısını yapardım

  • Projeyi işlemek tuhaf görünüyor görevler/create.js.coffee nedenle

kullanıcı verisi, ben bu şeyleri işlemek için daha iyi bir model için herhangi bir fikir arıyorum?

DÜZENLEME (netleştirmek için): Ben ulaşmada düşünüyorum böyle bir şey daha iyi olurdu:

görevler/create.js.coffee

# Update task table 
$('#mytable').append("<%= j render(partial: 'tasks/task', locals: { t: @task }) %>") 

UserData.refresh() 
ProjectData.refresh() 

Ancak, ben yapamam çünkü her defasında kısmi render yapmam gerektiğinden, bu html kısmi kısmını refresh() işlevlerine geçirmek gibi garip bir şey yapmak zorunda kalacağım ve bir önceki yolla aynı olurdu. Bu, aklıma gelen bir yoldu, ancak eğer varsa fikrinizi duymak isterim.

+0

Sorduğun şey bana açık değil. Ne yapmaya çalışıyorsun? –

+0

Şu anda bu makalede anlattığım 2 sorundan kaçınmaya çalışıyorum: Proje ve kullanıcıyla ilgili bu modellerin her birindeki projeyi ve kullanıcı verilerini güncellemek için kodu tekrarlamamak. Ve görev js içinde kullanıcı ve proje güncelleme sorumluluğu yok. Bu konular çok ilgili olsa da –

+0

@DaveNewton Benim düşünceme bak, bazı şeyleri açıklığa kavuşturabilirim, bu –

cevap

0

bu konuya bir cevap ilginizi çekebilir herkes için, ben Garber-İrlanda desen bulundu benim sorunum için harika bir çözüm.

Bu konu hakkında daha fazla bilgi bulabilirsiniz: https://www.viget.com/articles/extending-paul-irishs-comprehensive-dom-ready-execution

bile bir mücevher vardır: https://github.com/tonytonyjan/gistyle

bu modeli kullanarak, HTTP istekleri için yürütme bağlamları olabilir. Örneğin, her js denetleyicisinde bir afterCreate() yöntemine sahip olabilirsiniz ve HTTP İsteğinizin oluşturulduğu yere bağlı olarak, farklı bir olayı tetikleyebilirsiniz.

Bu, görünümü güncelleştirmek için polimorfik yanıtların kullanılmasına izin verir.

1

Farklı bir denetleyiciye ait bir şablonu/eylemi oluşturabilirsiniz. Yani görevler/create.js.coffee dosyasını tutmak ve aynı kodu kullanabilirsiniz (kullanıcılar ve projeler gibi) tüm diğer denetleyici eylemler için olabilir, senin respond_to bloğunda istersek:

format.json { render 'tasks/create' } 

Hatta could raylar içinde render üzerinde İşte

format.json { render file: "path/to/specific/file" } 

fazla bilgi içeren bir link: belirli bir dosyayı işlemek http://guides.rubyonrails.org/layouts_and_rendering.html#rendering-an-action-s-template-from-another-controller

+0

Bunu biliyorum, ama sorunumu çözmeyeceğim, zaten yaptığım şey bu. Kodum görev/create.js.coffee oluşturuyor. Sorun şu ki, bu dosya görevle tamamen ilgili olmayan çoklu görünüm güncellemeleriyle ilgileniyor. Ancak, yardımınız için çok teşekkürler –

+1

Yanlış anlaşılma için özür dilerim. Bunu işlemek için düşünebildiğim tek yol, denetleyicinin json bilgileriyle (javascript oluşturmak yerine) yanıt vermesi ve sayfadaki bilgileri güncellemek için jQuery ajax başarı geri çağırma özelliğini kullanmasıdır. Sonra tüm sayfa güncellemelerini işlemek için bir dosya olurdu. “UserData.refresh()” ve “ProjectData.refresh()” gibi ortak işlevler bile oluşturabilirsin, ancak onun tümü denetleyici oluşturma işlemi yerine javascript'te olabilir. Yaptığın gibi bir şey düşünmüyorum artık o kötü ya da alışılmadık, bunlar sadece başka seçenekler. – farrows76

İlgili konular