Jquery 一旦更改显示/更改部分
有一个使用select的下拉列表Jquery 一旦更改显示/更改部分,jquery,ruby-on-rails,selectionchanged,Jquery,Ruby On Rails,Selectionchanged,有一个使用select的下拉列表 <%= select("array", "folder", @rows.keys, {}, :onchange =>"?" )%> “?”“”%> 有一个部分叫做“形式” 每当选择发生更改时,我都需要渲染部分。如果有办法的话,请告诉我。我发现rails 3.0不推荐使用remote\u函数。我在这里看到了onchange和select标签的所有可能链接,但找不到正确的答案。我不熟悉rails、jQuery和Ajax。请帮忙 谢谢为什么不
<%= select("array", "folder", @rows.keys, {}, :onchange =>"?" )%>
“?”“”%>
有一个部分叫做“形式”
每当选择发生更改时,我都需要渲染部分。如果有办法的话,请告诉我。我发现rails 3.0不推荐使用remote\u函数。我在这里看到了onchange和select标签的所有可能链接,但找不到正确的答案。我不熟悉rails、jQuery和Ajax。请帮忙
谢谢为什么不在同一页中呈现表单,并在选择标签的更改上隐藏和显示它
<html>
<body>
<!-- Your Select tag -->
<select id="select_id">
<option value="one" selected> One </option>
<option value="two"> Two </option>
</select>
<!-- Here your a div inside with your form is placed -->
<div id="myform" style="display:none">
<form action="/someurl">
.. ..
</form>
<!-- JQuery code to show the form -->
<script type="text/javascript">
$(document).ready(function() {
$("select#select_id").bind("change",function() {
if ($(this).val() == "one")
$("div#myform").show();
else
$("div#myform").hide();
})
})
</script>
</html>
在服务器端,您需要使用format.js
响应ajax请求,并使用render命令呈现一个模板,或者只定义一个.js.erb
文件确实有一种方法可以做到这一点,这需要做一些工作,但一旦掌握了窍门,就很容易了
首先,您需要将jQuery函数附加到选择框的change
事件。这可以通过向application.js
文件添加一些javascript来实现。我们想在这里这样做,所以我们的脚本仍然存在。您可以在application.js
文件中尝试以下操作:
$(document).ready(function(){
$("#select_field_id").change(function(){
var id = $(this).children(":selected").val();
var params = 'some_id=' + id;
$.ajax({
url: "/some_controller/change_folder",
data: params
})
});
这样做的目的是将匿名函数附加到id为的select字段的change
事件select\u field\u id
。当该字段更改时,所选选项的id
将存储在varid
中,然后我们通过执行var params='some_id='+id为将发送的请求创建一个参数代码>some\u id
将是您正在更改的任何内容的id(因此,如果您在示例中使用的是文件夹\u id
)
现在我们需要在控制器中创建处理该请求的方法。继续文件夹示例,将其添加到文件夹控制器:
def change_folder
@folder = Folder.find(params[:some_id])
respond_to do |format|
format.js
end
end
这只是根据ajax请求发送到change\u folder
的id查找文件夹。它还将寻找相应的change\u folder.js.erb
或change\u folder.js
文件进行渲染
现在我们需要编写一个change\u folder.js.erb
文件。我们需要用我们得到的新文件夹替换页面某些部分的HTML,因此您应该有某种div
或具有唯一id的其他部分
在change_folder.js.erb
中,我们可以这样写:
$('#your_div').html("<%= escape_javascript(render(partial: "folder",
locals: { :folder => @folder })).html_safe %>")
在\u文件夹.html.erb
partial中.name
和.last\u updated
当然只是文件夹模型的属性。您将不得不使用您为文件夹模型指定的任何属性
这会让你去你想去的地方。如果您需要任何澄清,请告诉我。非常感谢,因为我对Rails、Jquery和Ajax都是新手,所以我需要一些时间来创建一个.js.erb文件并从中渲染部分内容。目前@viren解决了我的问题。非常感谢您对@Zajn的介绍,我遇到了几件事:1)您需要在routes.rb文件中添加一个与change\u文件夹
相对应的文件,在本例中类似于get:change\u文件夹
,根据ajax调用的位置,您可能需要稍微处理一下它。2)明白了:change\u folder.js.erb
中的任何js错误都会无声地失败,因此它可能看起来无缘无故不起作用,请确保通过执行类似console.log(…)的简单操作来测试js文件
我是否还必须在控制器中允许额外参数(使用Rails 5.1.3)?由于某种原因,它对我不起作用。我已经按照您的回答和ohhh的评论中的步骤进行了操作。谢谢谢谢,问题似乎已经解决了,如果我需要更多的细节,我会回来的
def change_folder
@folder = Folder.find(params[:some_id])
respond_to do |format|
format.js
end
end
$('#your_div').html("<%= escape_javascript(render(partial: "folder",
locals: { :folder => @folder })).html_safe %>")
<%= @folder.name %>
<%= @folder.last_updated %>