【问题标题】:onchange display/change a partialonchange 显示/更改部分
【发布时间】:2026-01-14 04:00:02
【问题描述】:

有一个使用选择的下拉菜单

<%= select("array", "folder", @rows.keys, {}, :onchange =>"?" )%>

有一个部分叫“表格”

<%= render "form"%>

我需要在选择选择的变化时呈现部分。请让我知道是否有办法做到这一点。我发现 remote_function 已从 rails 3.0 中弃用。我在这里看到了所有带有 onchange 和 select 标签的可能链接,但找不到正确的答案。我是 Rails、jQuery 和 Ajax 的新手。请帮忙

谢谢

【问题讨论】:

    标签: jquery ruby-on-rails selectionchanged


    【解决方案1】:

    肯定有办法做到这一点,而且需要一些工作,但一旦掌握了窍门,就很容易了。

    首先,您需要将 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.erbchange_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 模型提供的任何属性。

    这应该让你去你需要去的地方。如果您需要澄清任何事情,请告诉我。

    【讨论】:

    • 非常感谢,因为我对 Rails、Jquery、Ajax 完全陌生,所以我需要一些时间来创建一个 .js.erb 文件并从中渲染一部分。目前@viren 解决了我的问题。
    • 非常感谢@Zajn 的撰写,我遇到了一些事情: 1) 在这种情况下,您需要在您的 routes.rb 文件中添加一个 member route 对应于 change_folderget :change_folder 之类的东西,您可能需要根据ajax 调用的位置来稍微尝试一下 2) 问题:change_folder.js.erb 中的任何 js 错误都会静默失败,所以看起来就像它无缘无故地不起作用一样,一定要通过做一些简单的事情来测试js文件,比如console.log(...)
    • 我是否还必须在控制器中允许额外的参数(使用 Rails 5.1.3)?出于某种原因,它对我不起作用。我已按照您的回答和 ohhh 的评论中的步骤进行操作。谢谢!
    【解决方案2】:

    为什么不在同一页面中渲染表单并在select标签change上隐藏和显示

    <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>
    

    你还想发出一个ajax请求我也很简单

    $(document).ready(function() {
      $("select#select_id").bind("change",function() {
        if ($(this).val() == "one") {
         $.ajax({
            url : "/form_url",
            data : "html", 
            type: "GET",
            success : function(data) {
              $("div#myform").html(data)
            }
         }) 
    
      })
    })
    

    在服务器端,您需要使用 format.js 响应 ajax 请求并使用渲染命令渲染模板,或者只定义一个 .js.erb 文件

    【讨论】:

    • 谢谢,看来问题已经解决了,如果需要更多详细信息我会回复
    最近更新 更多