肯定有办法做到这一点,而且需要一些工作,但一旦掌握了窍门,就很容易了。
首先,您需要将 jQuery 函数附加到选择框的 change 事件。这可以通过在您的application.js 文件中添加一些javascript 来完成。我们想在这里这样做,所以我们的 javscript 仍然是unobtrustive。您可以在 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_field_id 的选择字段的 change 事件。当该字段更改时,所选选项的id 将存储在 var id 中,然后我们为将通过执行 var params = 'some_id=' + id; 发送的请求创建一个参数。 some_id 将是您要更改的任何内容的 id(如果您在示例中使用的是 folder_id,则为 folder_id)。
现在我们需要在控制器中创建将处理此请求的方法。因此,使用文件夹示例,将其添加到文件夹控制器:
def change_folder
@folder = Folder.find(params[:some_id])
respond_to do |format|
format.js
end
end
这只是根据您的 ajax 请求发送到 change_folder 的 id 找到一个文件夹。它还将寻找相应的change_folder.js.erb 或change_folder.js 文件进行渲染。
现在我们需要编写一个change_folder.js.erb 文件。我们需要将页面某些部分的 HTML 替换为我们获得的新文件夹,因此您应该有某种 div 或其他具有唯一 ID 的部分。
在change_folder.js.erb里面,我们可以这样写:
$('#your_div').html("<%= escape_javascript(render(partial: "folder",
locals: { :folder => @folder })).html_safe %>")
这将呈现一个名为 _folder.html.erb 的部分文件,它与 change_folder.js.erb 文件位于同一目录中。部分将需要使用 @folder 变量来显示字段,因此您需要以下内容:
<%= @folder.name %>
<%= @folder.last_updated %>
在您的 _folder.html.erb 部分内部。 .name 和 .last_updated 当然只是组成文件夹模型的属性。您必须改用您为 Folder 模型提供的任何属性。
这应该让你去你需要去的地方。如果您需要澄清任何事情,请告诉我。