【问题标题】:form_with search field in Rails 5.1Rails 5.1 中的 form_with 搜索字段
【发布时间】:2017-03-25 06:35:49
【问题描述】:

在 Rails 5.1 中,所有表单都必须使用form_with 完成。在http://edgeguides.rubyonrails.org/5_1_release_notes.html#unification-of-form-for-and-form-tag-into-form-with我只能找到与模型相关的表单示例。

在 Rails 5.1 中使用form_with 完成此 Rails 5.0 表单的正确方法是什么?

<%= form_tag("/search", method: "get") do %>
  <%= label_tag(:q, "Search for:") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Search") %>
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 ruby-on-rails-5.1


    【解决方案1】:

    这是form_with 调用,与问题中的form_tag 调用完全相同:

    <%= form_with url: '/search', method: :get, local: true do |f| %>
      <%= f.label :q, "Search for:" %>
      <%= f.text_field :q, id: :q %>
      <%= f.submit "Search" %>
    <% end %>
    

    请注意,form_with 默认通过 XHR(又名 remote: true)发送,您必须添加 local: true 以使其行为类似于 form_tag 的默认 remote: false。

    在rails guides、API docs 和this github issue discussion 中查看更多信息。

    【讨论】:

      【解决方案2】:

      form_with 是rails 5.1 中的更新功能,它在rails 中创建表单的统一方式可以用作form_for 或form_with,它包含某些选项

      :url - 表单提交到的 URL。类似于传递给 url_for 或 link_to 的值。例如,您可以直接使用命名路由。当传递 :scope 时不带 :url 时,表单只会提交到当前 URL。

      :method - 提交表单时使用的方法,通常是“get”或“post”。如果使用了“patch”、“put”、“delete”或其他动词,则会添加一个名为 _method 的隐藏输入来模拟 post 上的动词。

      :format - 表单提交到的路由格式。在提交到其他资源类型时很有用,例如 :json。如果通过 :url 则跳过。

      :scope - 输入字段名称前缀的范围以及提交的参数在控制器中的分组方式。

      :model - 用于推断 :url 和 :scope 的模型对象,并填写输入字段值。因此,如果标题属性设置为“Ahoy!”那么标题输入字段的值将是“Ahoy!”。如果模型是新记录,则会生成创建表单,但是,如果是现有记录,则会生成更新表单。通过 :scope 或 :url 覆盖默认值。例如。把 params[:post] 变成 params[:article]。

      :authenticity_token - 在表单中使用的真实性令牌。使用自定义真实性令牌覆盖或传递 false 以完全跳过真实性令牌字段。在提交到可能限制有效字段的支付网关等外部资源时很有用。远程表单可以通过设置 config.action_view.embed_authenticity_token_in_remote_forms = false 来省略嵌入的真实性令牌。这在对表单进行片段缓存时很有帮助。远程表单从元标记中获取真实性令牌,因此除非您支持不带 JavaScript 的浏览器,否则不需要嵌入。

      :local - 默认情况下,表单提交是远程且不显眼的 XHR。 使用 local: true 禁用远程提交。

      :skip_enforcing_utf8 - 默认情况下会输出一个名为 utf8 的隐藏字段 强制 UTF-8 提交。设置为 true 以跳过该字段。

      :builder - 覆盖用于构建表单的对象。

      :id - 可选的 HTML id 属性。

      :class - 可选的 HTML 类属性。

      :data - 可选的 HTML 数据属性。

      :html - 表单标签的其他可选 HTML 属性。

      示例

      <%= form_with(model: @post, url: super_posts_path) %>
      <%= form_with(model: @post, scope: :article) %>
      <%= form_with(model: @post, format: :json) %>
      <%= form_with(model: @post, authenticity_token: false) %>
      

      form_with 的命名空间路由示例

      对于命名空间路由,例如 admin_post_url:

      <%= form_with(model: [ :admin, @post ]) do |form| %>
        ...
      <% end %>
      

      与相关资源

      如果您的资源定义了关联,例如,如果路由设置正确,您希望将 cmets 添加到文档中:

      <%= form_with(model: [ @document, Comment.new ]) do |form| %>
        ...
      <% end %> 
      

      欲了解更多信息,请查看doc

      【讨论】:

        【解决方案3】:

        你可以像这样使用form_with:

        <%= form_with(url: '/search') do |f| %>
          <%= f.label(:q, "Search for:") %>
          <%= f.text_field(:q, id: :q) %>
          <%= f.submit("Search") %>
        <% end %>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-17
          • 1970-01-01
          • 1970-01-01
          • 2015-09-08
          • 1970-01-01
          • 2021-07-13
          • 1970-01-01
          • 2018-06-29
          相关资源
          最近更新 更多