2013-02-28 28 views
1

是否有可能改變params哈希表的值時,一個JavaScript函數被調用? 我有一個隱藏的股利,說DIV1基於在選擇字段選擇的值,內DIV1,我有一個只讀文本字段的值被設置爲一個輔助方法返回一個值,該值變得可見。Rails更新PARAMS使用Javascript

這個幫助器方法使用一個取決於Params值的動態find_by,但我猜param Hash在select Changes的值不變時(因爲它不是整頁刷新?)。請,我該如何實現更新,以便當選擇值更改時,新值反映在params散列中。我在form_for標記中有:remote => true。有比我更好的方法嗎?

在軌選擇欄查看

#finance_year 
<%=f.select :financeyear, options_for_select(finance_year),{ :include_blank => 'Select a 
Financial Year' } %> 

,併爲選擇

jQuery -> 
$('#finance').hide() 
value = "Select a Financial Year" 
$('#finance_financeyear').change -> 
selected = $('#finance_financeyear :selected').text() 
$('#finance').show() 
$('#finance').hide() if selected is value 

輔助方法

def amount_owed(student) 
financeyear = params[:financeyear] 
@thisstudent = Finance.find_last_by_user_id(@student.user_id, 
:conditions => {:financeyear => financeyear }) 
if(@thisstudent) 
    @amount_owed= @thisstudent.amount_owed 
else 
    student.department.amount 
end 
end 

我感謝所有幫助,我希望一個一個onchange事件我能夠聰明地問這個問題。

回答

2

答案是AJAX。

首先,我們需要一個新的路由添加到config/routes.rb,使amount_owed()一個真正的行動:

get '/finance_years/amount_owed/:student_id/:financeyear' => "finance_years#amount_owed" 

接下來,我們將創建一個默認視圖每當amount_owed()動作稱爲退貨:

/app/views/finance_years/amount_owed.html.erb

<%= @amount_owed %> 

所以,那一部分很簡單。現在,我們需要編輯amount_owed行動,因此將與我們的工作參數:

/app/controllers/finance_years_controller.rb

def amount_owed(student) 
    financeyear = params[:financeyear] 
    @thisstudent = Finance.find_last_by_user_id(params[:student_id], 
     :conditions => {:financeyear => financeyear }) 

    if(@thisstudent) 
     @amount_owed= @thisstudent.amount_owed 
    else 
     @amount_owed = student.department.amount 
    end 
end 

通過這種方式,我們可以通過在財務年度和學生id從params散列並每次獲得amount_owed。現在,爲了讓我們的coffeeScript訪問當前的student_id和finance_year變量,我會在視圖文件中添加一些隱藏字段到表單中:

/app/views/finance_years/_form.html。ERB

<%= hidden_field_tag :student_id, @student_id %> 
<%= hidden_field_tag :finance_year, @finance_year %> 

的最後絕招是編輯的CoffeeScript,發射了異步GET請求,只要選擇框的變化。

/app/assets/javascripts/finance_years.js.coffee

$('#finance_financeyear').change -> 
    student_id = $("#student_id").val() 
    finance_year = $("#finance_year").val() 
    selected = $('#finance_financeyear :selected').text() 
    $('#finance').show() unless selected == value 
    $.get "/finance_years/amount_owed/#{student_id}/#{finance_year}", (response)-> 
     $('#finance input[type=text]').load(response) 

這就是所有我能做的是從我的Rails開發的機器了。如果出現其他問題,請告知我。

+1

感謝,很少的修改工作,謝謝〜 – dev 2013-03-02 20:15:37

+0

很高興我參加了您的解決方案。 – 2013-03-02 20:35:15

1

我不是一個Rails的專家,但你不會是能夠直接從JavaScript修改服務器端代碼。您需要向服務器進行調用(通過表單提交或通過ajax請求)以通知服務器自行更新。

爲了澄清,服務器代碼負責頁面的初始渲染,但一旦模板已經呈現它不會在客戶端頁面上存在。所以你不能直接從coffeescript/javascript中修改它。您需要將請求發送回服務器以處理該請求。

+0

太感謝你了 – dev 2013-03-02 20:16:46