使用 link_to 传递 text_field 值

sha*_*jin 2 jquery ruby-on-rails

<%= text_field_tag 'search_name', :class => 'search_save' %>
<%= link_to "Save search" , save_search_path(@some_value), :remote => true, :method => :post %>
Run Code Online (Sandbox Code Playgroud)

有没有办法通过给定的链接传递 search_name 文本字段的值?

Bar*_*cha 5

如果您尝试将值发布到服务器,您应该使用 HTML 表单。这就是它们的设计目的。事实上,当您:method => :post为帮助程序指定 as on 选项时link_to,Rails 会动态创建一个 HTML 表单,单击链接时会立即发送该表单。为什么不直接这样做呢?

<%= form_tag '/save_search' do -%>
  <%= text_field_tag 'search_name', :class => 'search_save' %>

  <%= submit_tag 'Save search' %>
<% end -%>
Run Code Online (Sandbox Code Playgroud)

这将根据需要将值发布到服务器(可在params[:search_name]控制器操作内部访问)。

如果这是一个美观问题(例如,您认为按钮很丑并且需要链接),您始终可以将提交按钮设置为看起来像带有普通旧 CSS 的链接。对于用户来说,它看起来像一个链接,但更重要的是,它的行为就像一个按钮,并且无需任何附加逻辑即可提交表单。

如果您仍然不相信使用表单是正确的方法,并且您热衷于让它发挥作用,那么您可以使用 jQuery 来实现。让我们拿你的示例代码稍微修改一下

<%= text_field_tag 'search_name', :class => 'search_save' %>
<%= link_to "Save search" , save_search_path(@some_value), :id => 'save_search' %>
Run Code Online (Sandbox Code Playgroud)

然后在你的里面application.js你可以添加以下内容。

$(function() {
    // Add click event binding to `Save search` link
    $("#save_search").on("click", function(event) {
        event.preventDefault(); // don't trigger default

        // get the value inside the text field
        var name = $("#search_name").val();

        $.post('/save_search', { search_name: name }, function(data) {
            // log the result from the server, or whatever...
            console.log(data);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

当有人单击“保存搜索”链接时,此事件将被触发,并将使用指定的数据对服务器进行 AJAX 调用(除非用户做了一些愚蠢的事情,例如禁用 JavaScript)。控制器操作将能够通过访问此数据params[:search_name]。希望这可以帮助。快乐编码!

  • 该答案使用“form_tag”和“submit_tag”,问题询问如何使用“text_field_tag”和“link_to”。它很重要,因为有时已经有一个表单,并且表单不能嵌套。 (2认同)