2016-04-09 19 views
0

Bu yüzden, bir hedef içindeki görevlerin bir listesini oluşturmaya çalışıyorum ve bunları tamamlamak için, güncelleyeceğim gizli bir alana sahip bir form_for oluşturuyorum Gönderme sırasında her bir görev kaydının değeri. Ajax'i forma eklemeye çalışıyorum, böylece bir kullanıcı isabet ettiğinde, görev için rekoru güncelleyecektir ve bu formu “tamamlandı” diyerek bir div ile değiştirecektir. Hedeflerİç içe geçmiş kaynakları ve html sınıfı olan her bir döngü içinde bir formda Raylar Ajax

için

goals_controller.rb

def show 
    @goal = Goal.where(user_id: current_user, id: params[:id]).first 
    @goal_tasks = @goal.tasks 

    # This is where the AJAX request will happen 
    respond_to do |format| 
    format.html {} 
    format.js {} 
    end 
end 

show.html.erb

<% @goal_tasks.each do |task| %> 
     <div class="complete-button"> 
      <% if task.completed == false %> 
       <%= form_for([@goal,task], remote: true) do |f| %> 
        <%= f.hidden_field :completed , :value => true %> 
        <%= f.submit "Complete" , :class => "submit-complete" %> 
       <% end %> 
      <% else %> 
       <%= render partial: "goals/taskcompleted" %> 
      <% end %> 
     <div> 
    <% end %> 

show.js.erb

$(".complete-button").html("<%= j(render partial: 'goals/taskcompleted') %>")

Oluşan davranış, birden çok görev varsa, html içinde benzersiz id="edit_task_unique_id" ile birden çok form vardır, ancak ben show.js.erb içinde .complete-button sınıfını kapıyorum beri. Bütün formlar, tamamen div ile değiştirilir. Bir şekilde, her bir görevle yaratılan formun eşsiz kimliğini yakalamaya çalıştım ama şans yok. Herhangi bir yardım veya geribildirim takdir edilir!

cevap

1

Göster, bir GET türü, yaptığınız bir PUT türüdür. Güncelleme yöntemini kullanabilir veya özel bir tane oluşturabilirsiniz. Kullanıcıların bir şey yazmasını beklemediğinizden, forma bile ihtiyacınız yok. Bunun üzerine, datetime türüyle :completed_at alanını kullanırdım. Eğer öyleyse, tamamlanmadıysa, tamamlanmamışsa (eğer bir tarih yoktur) tamamlanır.

routes.rb

resources :goals do 
    resources :tasks do 
    member do 
     patch :complete 
    end 
    end 
end 

hedefler/show.html.erb

.... 
<%= render @tasks %> # this is a rails convention. Basically it iterates thru the @tasks and renders each task based on _task.html.erb which represents a single task. 
.... 

görevler/_task.html.erb

#You use task instead of @task as you do within a @tasks.each |task| do block. 

<%= task.name %> 
<%= task.content %> 
<% if task.completed_at.nil? %> 
    #here you only need to pass task.id to the path (rails convention again) 
    <%= link_to "Complete Task", complete_goal_task_path(id: task.id), action: :complete, remote: true, method: :patch %> 
<% end %> 

gol kontrol

def show 
    # I don't know why you wrote this: 
    @goal = Goal.where(user_id: current_user, id: params[:id]).first 
    #It should be just this since you are on the show page (You should define the current_user in the view link helper that takes the user on this page.) 
    @goal = Goal.find(params[:id]) 
    @tasks = @goal.tasks 
end 

görevler kontrolör

def complete 
    @task = Task.find(params[:id]) 
    @task.update_attribute(:completed_at, Time.zone.now) 
    respond_to do |format| 
    format.html 
    format.js 
    end 
end 

görevler/complete.js.erb

//You remove the completed task from the DOM (I guess you wanna do that.) 
$("#task_<%= @task.id %>").fadeOut(400, function(){ 
    $(this).remove(); 
}); 
//For flash checkout a stackoverflow question. Something like "how to use flash in js.erb" 

schema.rb

create_table "tasks", force: :cascade do |t| 
    t.integer "goal_id", null: false 
    t.string "name" 
    t.text  "content",  null: false 
    t.datetime "deadline",  null: false 
    t.datetime "completed_at" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 
+0

Yardımlarınız için teşekkür ederiz! Sadece birkaç sorum var ve geri bildiriminizden bir ton öğreniyorum. Bu yüzden bir boolean ve datetime (nil?) Seçeneğini kullanma arasındaki farkın ne olduğunu sormak istedim. –

+0

datetime ile, görevi bitirdiğinde kullanıcıya göstermek için datetime (task.completed_at) öğesini de kullanabilirsiniz. –

+0

Başarılı oldunuz mu? –

İlgili konular