1

调用 Javascript 函数时是否可以更改 Params 哈希中的值?我有一个隐藏的 Div,比如说 DIV1,它根据选择字段中的选定值变得可见,在 DIV1 中,我有一个只读文本字段,其值设置为辅助方法返回的值。

这个帮助方法使用了一个动态的 find_by ,它取决于 Params 的值,但我猜当 select 的值发生变化时 param Hash 不会改变(因为它不是整页刷新?)。Please, how do I Achieve updating this so that when the select Value changes, the new value is reflected in the params hash. 我在 form_for 标签中有 :remote=>true 。有比我更好的方法吗?

rails 视图中的 Select 字段

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

以及该选择的 onchange 事件

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

我感谢任何帮助,我希望我能够聪明地提出这个问题。

4

2 回答 2

3

答案是 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

这样,我们可以从 params 哈希中传入财政年度和学生 ID,并每次获得一个 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 %>

The last trick is to edit the coffeeScript, firing an asynchronous GET request whenever the select box changes.

/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 开发机器时所能做的一切。如果出现其他问题,请告诉我。

于 2013-02-28T15:07:51.387 回答
1

我不是 Rails 专家,但您无法直接从 javascript 修改服务器端代码。您将需要调用服务器(通过表单提交或通过 ajax 请求)来告诉服务器进行自我更新。

澄清一下,服务器代码负责页面的初始渲染,但是一旦模板被渲染,它就不存在于客户端页面上。所以你不能直接从coffeescript/javascript 修改它。您需要将请求发送回服务器来处理。

于 2013-02-28T14:43:10.020 回答