2013-02-28 174 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