2015-09-05 35 views
1

我在寫一個時間跟蹤應用程序。我有一個Project型號,它具有time_logged屬性。Rails:在彈出窗口中不調用控制器動作的遠程窗體

我正在使用遠程窗體 - 在彈出窗口中呈現 - 記錄用戶的時間。提交時,jQuery事件處理程序會將跟蹤的時間(以秒爲單位)分配給表單中的隱藏字段。所有的JS正在被正確執行。

控制器應該調用一個方法來記錄跟蹤窗體中所選項目的時間,但項目永遠不會更新。我想或者表單沒有正確地調用控制器動作,或者我編寫控制器時出現了問題。

但我無法弄清楚什麼。我將在下面包含相關的代碼片段。

projects_controller.rb

respond_to :html, :js 

    def track 
    @project = Project.new 
    end 

    def log_time 
    @project = Project.find(params[:project][:id]) 
    @project.increment_time_logged(project_log_time_params.to_i) 
    end 

    private 

    def project_params 
     params.require(:project).permit(:id, :name, :fee, :client_id) 
    end 

    def project_log_time_params 
     params.require(:project).permit(:time_logged) 
    end 

project.rb

def increment_time_logged(number_of_seconds) 
    self.time_logged += number_of_seconds 
    end 

的routes.rb

match '/projects/track-time', to: 'projects#track', via: 'get' 
    match '/projects/log-time', to: 'projects#log_time', via: 'put' 

_track_time_form.html.erb

<%= javascript_include_tag "track.js.erb" %> 
<div id="countdown-timer"></div> 
<div id="playback-button">&#9658;</div> 
<div id="track-time-form"> 
    <%= form_for @project, :url => "/projects/log-time", remote: true do |p| %> 
     <ul> 
      <li><%= p.label :project, "Project:"%><br> 
      <%= p.collection_select(:id, current_user.projects, :id, :name) %></li> 

      <%= p.hidden_field :time_logged, :value => 0 %> <!-- value set by script in log_time.js.erb --> 

      <li><%= p.submit "Log time", id: "log-time-button" %></li> 
     </ul> 
    <% end %> 
</div> 

track.js.erb

//initialise form 
timeTrackingForm = window.open("", "", "height=700,width=500"); 
$(timeTrackingForm.document.body).html("<%= j render(:partial => 'track_time_form') %>"); 

//assign variables 
var timer = $("#countdown-timer", $(timeTrackingForm.document)); 
var playbackControls = $("#playback-button", $(timeTrackingForm.document)); 
var form = $("#track-time-form", $(timeTrackingForm.document)); 
var actual_form = $("#new_project", $(timeTrackingForm.document)); 
var formUl = $("#track-time-form ul", $(timeTrackingForm.document)); 
var formLi = $("#track-time-form li", $(timeTrackingForm.document)); 
var logTimeButton = $("#log-time-button", $(timeTrackingForm.document)); 
var hidden = $("input:hidden", $(timeTrackingForm.document)); 
var timerPaused; 

//initialise timer 
$(timeTrackingForm.document).ready(function(){ 
    initialiseTimer(); 
    style(); 
    $(playbackControls).click(function() { 
     playOrPause(); 
    }); 
    $(actual_form).submit(function(){ 
     $(timer).timer('pause'); 
     timerPaused = true; 
     var secondsTracked = $(timer).data('seconds'); 
     $(hidden).val(secondsTracked); 
     resetTimerDisplay(); 
    }); 
}); 

function initialiseTimer() { 
    $(timer).timer({ 
     format: '%H:%M:%S' 
    }); 
    $(timer).timer('pause'); 
    timerPaused = true; 
} 

function resetTimerDisplay() { 
    $(timer).timer('reset'); 
} 

function style() { 
    $(timer).css({'color':'black','font-size':'50px', 'margin':'auto', 'width':'180px'}); 
    $(playbackControls).css({'color':'#290052', 'font-size':'50px', 'margin':'auto', 'width':'55px'}); 
    $(form).css({'width':'300px','margin':'auto'}); 
    $(formUl).css({'list-style-type':'none'}); 
    $(formLi).css({'margin':'0 0 25px 0','font-sizeL':'18px','font-family':'Arial'}); 
    $(logTimeButton).css({'width':'180px','font-size':'18px','background-color':'green','color':'white','margin-top':'15px'}); 
} 

function playOrPause() { 
    if (timerPaused == true) { 
     $(timer).timer('resume'); 
     timerPaused = false; 
    } 
    else { 
     $(timer).timer('pause') 
     timerPaused = true; 
    } 
} 
+0

你能後的'params'在表單提交日誌中生成的?我懷疑這行'@project.increment_time_logged(project_log_time_params.to_i)'是錯誤的。 – Pavan

+0

@Pavan沒有任何生成。我認爲這是正常的,因爲請求是通過AJAX發送的? – bitfizzy

+0

@Pavan它看起來像控制器操作'log_time'完全沒有被調用。我添加了'puts',log_time已經被調用了方法,但是這並沒有在服務器日誌中打印出來。有任何想法嗎? – bitfizzy

回答

0

它看起來像你有你的模型的問題。目前,您只是更改屬性,但不會將記錄保存到數據庫。

更改此

def increment_time_logged(number_of_seconds) 
    self.time_logged += number_of_seconds 
    end 

要這樣:

def increment_time_logged(number_of_seconds) 
    self.time_logged += number_of_seconds 
    self.save 
end 

或者,如果你想跳過活動記錄的驗證,使用:

def increment_time_logged(number_of_seconds) 
    time = self.time_logged += number_of_seconds 
    self.update_attribute(:time_logged, time) 
end 
+0

這絕對是一個促成因素,所以謝謝!看起來問題是'log_time'根本沒有被調用(參見上面的註釋)。有任何想法嗎? – bitfizzy

+0

在你的控制器中試試這個。如果你更新一個特定的屬性,你不需要強參數:@project.increment_time_logged(params [:time_logged] .to_i) – JeffD23

+0

它不是@ project.increment_time_logged(params [:project] [:time_logged] .to_i)? 無論哪種方式,我試過兩個版本,沒有這樣的運氣:(我認爲問題在於控制器的操作根本沒有被調用。你有什麼想法,爲什麼這是? – bitfizzy

相關問題