一种可能是我所知道的最简单的方法,也是处理此问题的传统方法,是执行 Ajax 请求。JavaScript 是客户端,而 Ruby 通常是服务器端。
您可以在您的路由文件中创建一个路由,然后在相应的控制器中创建响应 JavaScript 而不是 HTML 的操作。在该 JavaScript 文件中,您可以更改或修改页面上的内容,并可以访问您更改的变量,重新渲染页面的某些部分,等等。我将在这里使用 jQuery,因为它更简洁。
在您的路线文件中:
post 'some_controller/make_a_change', to: 'some_controller#make_a_change'
然后,在您上面定义的函数中:
$.ajax({
url:'/some_controller/make_a_change', //Defined in your routes file
data:(
'special_id=' + $('#special_id').val() + '&' +
'target_area_id=' + $('#target_area_id').val()
)
})
在 SomeController.rb 中,您可以通过以下方式访问您的 JavaScript 值params
:
def make_a_change
some_special_id = params[:special_id]
taid = params[:target_area_id]
@values = TargetArea.where(:special_id => some_special_id)
respond_to do |format|
format.js { render 'make_a_change' } #make_a_change.js.erb
end
end
然后,我认为您可以在 make_a_change.js.erb 中完成其余的工作,每次您调用其他函数并且您的 Ajax 请求成功时都会运行它。
var select2 = document.getElementById("target_area_id");
select2.options.length = 1;
select2.options[select2.options.length] = new Option(<%= @values.count %>,"1");
根据您的需要进行调整。希望这可以帮助!
更新:
我刚刚意识到这一行:
select2.options[select2.options.length] = new Option(<%= @values.count %>,"1");
可能行不通。如果它是一个 HTML 选择框或类似的东西,你可以把它放在它自己的视图中,然后在 make_a_change.js.erb 中的适当位置重新渲染它。
像这样:
$('#some_div').html('<%= j render 'select2_list', values:@values %>')
大多数情况下,我的回答背后的主题是:如果你想与你的 Ruby 代码或来自 JavaScript 函数的服务器数据进行交互,这是当你点击一个按钮或选中一个框或类似的东西时调用的一些函数,你将拥有将 Ajax 请求发送到您的服务器并在您的控制器中处理该请求。然后,这将使您更接近 Rails,并且远离尝试将两个不同的语言变量与=
符号联系起来。