【问题标题】:Removing "utf8=✓" from Rails 3 form submissions从 Rails 3 表单提交中删除“utf8=✓”
【发布时间】:2011-05-28 03:09:27
【问题描述】:

我的 Rails 3 应用中有一个简单的搜索表单:

<%= form_tag search_path, :method => "get" do %>
  <%= text_field_tag :q, params[:q] %>
  <%= submit_tag "search", :name => nil %>
<% end %>

当用户点击提交按钮时,他们会被带到 URL:http://myapp.com/search?utf8=%E2%9C%93&q=foobar (其中%E2%9C%93 显示为复选标记:✓)。

我没有对 utf8 参数做任何事情,所以我想通过完全删除它来保持 URL 的干净。也就是说,我希望用户转到 URL:http://myapp.com/search?q=foobar

我该怎么做?

【问题讨论】:

  • 那么你最终做了什么?把它放在那里?
  • shingara 对stackoverflow.com/questions/4104474 的回答有效:只需使用&lt;form&gt;...&lt;/form&gt; 而不是&lt;%= form_tag %&gt;...&lt;% end %&gt;。请注意,只有在提交的内容永远不会出现在您的数据库中时,您才应该这样做,如 stackoverflow.com/questions/3222013 中所述。
  • 这是一个非常相关的问题,因为我不想用单个不符合标准的浏览器的解决方法来打扰我的用户。我只希望我拥有的少数 IE 用户使用这个“utf8=✓”。
  • 请参阅my answer 回复。 form_tag:enforce_utf8 选项。
  • 如果您想使用 Javascript/jQuery 序列化忽略 utf8 参数,您可以使用以下代码:$("form#my_form :input[name!='utf8']").serialize()。它将忽略序列化参数中的 utf8 键/值对

标签: ruby-on-rails utf-8


【解决方案1】:

我认为我们应该在 form_tag 中使用:enforce_utf8: false

例如:

= form_tag search_path, method: :get, id: 'searchForm', enforce_utf8: false

【讨论】:

    【解决方案2】:

    使用 before_action 并重定向到另一个操作对我有用。 例如,如果您正在搜索帖子,请设置搜索收藏的路线。

    resources :posts do
      collection do
        get 'search'
      end
    end
    

    并为 posts#index 操作发出 HTTP GET 请求。

    <%= form_tag posts_path, method: :get do %>
      <%= search_field_tag :q, params[:q], placeholder: "Search posts" %>
      <%= submit_tag "Go" %>
    <% end %>
    

    然后在 PostsController 中,

    before_action :check_for_query, only: :index
    
        ... 
    
    
    private 
      def check_for_query
        redirect_to articles_search_url(q: params[:q]) if params[:q].present?
      end
    

    并在 posts#search 操作中调用 Post.search 并渲染索引页面。

    def search
       Post.search(params[:q])
       render :index
    end
    

    网址将类似于 /posts/search?q=foo

    【讨论】:

      【解决方案3】:

      form_tag in Rails 4.2(可能更早)有一个:enforce_utf8 选项;

      如果设置为 false,则不输出名为 utf8 的隐藏输入。

      (同https://stackoverflow.com/a/28201543/430695

      【讨论】:

        【解决方案4】:

        一旦你理解了the purpose of the Rails UTF-8 param,并且由于某种原因你仍然需要删除它,解决方案比你想象的要容易......只是不要使用form_tag 助手:

        <form action="<%= search_path %>" method="get">
          <%= text_field_tag :q, params[:q] %>
          <%= submit_tag "search", :name => nil %>
        </form>
        

        【讨论】:

        • 这帮助我配置了 submit_tag 权限,谢谢!
        • 但是form_tag 助手带来了其他几个功能!
        【解决方案5】:

        有 gem (utf8_enforcer_workaround) 仅适用于不符合标准的浏览器(或任何其他逻辑)的 utf8 参数。如果您不想用 IE 变通方法打扰行为良好的用户,这很方便。

        【讨论】:

          【解决方案6】:

          我做了一个初始化程序来从 GET 请求中删除参数。这显然是一个 hack。

          这在config/initializers/overrides.rb:

          # Don't let Rails add a utf8=✓ param to GET forms.
          # See http://stackoverflow.com/questions/3222013/what-is-the-snowman-param-in-rails-3-forms-for for details.
          module ActionView::Helpers::FormTagHelper
          private
          
            def extra_tags_for_form_with_utf8_param_excluded_from_gets(html_options)
              old = extra_tags_for_form_without_utf8_param_excluded_from_gets(html_options)
              non_get = old.include?('"_method"') || old.include?('"'+request_forgery_protection_token.to_s+'"')
              if non_get
                old
              else
                old.sub(/<[^>]+name="utf8"[^>]+"&#x2713;"[^>]*>/, '').html_safe
              end
            end
          
            alias_method_chain :extra_tags_for_form, :utf8_param_excluded_from_gets
          
          end
          

          理想情况下,Rails 应该对此进行设置,或者至少重写 extra_tags_for_form 以便修补时不那么混乱。

          【讨论】:

            【解决方案7】:

            即使您没有对参数做任何事情,Rails 也是如此。修正IE参数编码中的一些问题。 Yehuda 在这里有更多信息:

            What is the _snowman param in Ruby on Rails 3 forms for?

            【讨论】:

            • 有没有办法通过在我的控制器中添加一些默认值来纠正 IE 参数编码中的这些问题?
            【解决方案8】:

            在你的 ApplicationController 中试试这个:

            def default_url_options(options={})
              options.delete('utf8')
            end
            

            【讨论】:

            • 这不起作用,因为该方法必须返回一个哈希值并且现在可能返回例如nil。但是将其更改为返回 { utf8: nil } 之类的内容也没有达到预期的效果。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-12
            • 2012-10-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多