【问题标题】:How to call a specific action inside a form_for如何在 form_for 中调用特定操作
【发布时间】:2017-05-19 07:22:24
【问题描述】:

我有一个包含一些 text_fields 的表单。其中之一是邮政编码字段。它有一个“搜索”按钮,该按钮调用特定操作“search_zip_code”,该操作返回与该字段关联的地址值。如何在 form_for 标记内调用此操作?我已经尝试过嵌套它的 form_tag,但是提交操作调用了 :create 方法。如果我使用“link_to”,则无法传递用户输入的邮政编码。最好的方法是什么?

<%= form_for(@model) do |m|%>
  <%= m.label :field_1 %>
  <%= m.text_field :field_1 %>

  <%= m.label :field_2 %>
  <%= m.text_field :field_2 %>

  <div class="field">
    <%= form_tag("/search_zip_code", method: "get") do %>
      <%= label_tag(:zip, "ZIP Code:") %>
      <%= text_field_tag(:zip) %>
    <%= submit_tag("Search") %>
  <% end %>
</div>

<%= m.submit %>
<% end %>

为什么 submit_tag 按钮没有到达操作“/search_zip_code”?即使我将此路由更改为 :post 方法,它也不起作用。

谢谢,

吉尔赫姆

【问题讨论】:

  • 将表单标签移到 form_for 之外,并在您的 form_tag 中添加一个 remote:true 以便它对您的控制器进行 ajax 调用。在您的控制器中,返回 javascript 或 json 并创建一个 javascript 文件,其中包含您要插入到 form_for 中的信息。
  • HTML 规范实际上不允许嵌套表单。通过使用嵌套表单,您依赖于 slop 解析,结果可能不一致。 w3.org/TR/html5/forms.html#the-form-element
  • 使用 javascript 将事件处理程序绑定到输入。
  • 非常感谢你们,伙计们!我会用 Ajax 做的!

标签: ruby-on-rails ruby form-for


【解决方案1】:

各位,根据https://launchschool.com/blog/the-detailed-guide-on-how-ajax-works-with-ruby-on-rails 和您的建议,我的解决方案应该如下所示:

我的主要_form.html.erb:

<%= form_for(@model) do |m|%>
  <%= m.label :field_1 %>
  <%= m.text_field :field_1 %>

 <%= m.label :field_2 %>
 <%= m.text_field :field_2 %>

 <div class="field">
    <%= m.label :zip %>
    <%= m.text_field :zip %>
    <input type="button" id="search" value="Search" >
</div>
<div id="address-data" style="display:none;"></div>

<script type="text/javascript" charset="UTF-8">
  $("#search").click(function() {
    $.ajax({
      url: '/search_zip_code?zip=' + m_zip.value,
      type: 'get'
    });
  });
</script>

<%= m.submit %>
<% end %>

控制器动作:

def search_zip_code
    @add_zip = search(params[:zip]
    respond_to do |format|
      format.js
    end
end

然后,我需要一个 search_zip_code.js.erb 文件:

$('#address-data').html("<%= j (render 'form-zip') %>");
$('#address-data').slideDown(350);

search_zip_code.html.erb,其中仅包含:

<%= render 'form-zip' %>

最后,_form-zip.html.erb 部分:

<%= simple_form_for @add_zip, remote: true do |z| %>
   <%= z.input :street %>
<% end %>

好消息是 zip 参数已正确传递给 search_zip_code 方法。

但是部分没有被渲染:我已经在所有这些 erb 文件中放置了断点。正在访问 search_zip_code.js.erb,但未访问 search_zip_code.html.erb,当然还有 _form-zip.html.erb。

我错过了什么吗?

谢谢!

吉尔赫姆

【讨论】:

    【解决方案2】:

    您好,您可以试试下面的嵌套表单代码

    <%= form_for @object, url => { controller: 'controller', action: 'create', method: :get } do |f| %>
      <%= f.text_field :first_name %>
      <%= f.submit %>
    <% end %>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 2014-07-09
      相关资源
      最近更新 更多