2010-12-20 17 views
61

Mam prosty formularz wyszukiwarki w moich szyn 3 aplikacji:Usuwanie „utf8 = ✓” z szyn 3 wysłanych formularzy

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

Kiedy użytkownik kliknie przycisk Prześlij, to im zabrany do URL: http://myapp.com/search?utf8=%E2%9C%93&q=foobar (gdzie %E2%9C%93 wyświetla się jako znacznik wyboru: ✓).

Nie robię nic z parametrem utf8, więc chcę zachować adres URL czysty, usuwając go w całości. Oznacza to, że chcę, aby użytkownicy zostali przeniesieni do adresu URL: http://myapp.com/search?q=foobar.

Jak to zrobić?

+3

więc co robiłeś w końcu? po prostu go tam zostawić? – Ayrton

+3

Odpowiedź shingara na http://stackoverflow.com/questions/4104474/ działa: po prostu użyj '

...
' zamiast '<% ​​= form_tag%> ... <% end %>'. Pamiętaj, że powinieneś to zrobić tylko wtedy, gdy przesłana treść nigdy nie trafi do twojej bazy danych, jak wyjaśniono na http://stackoverflow.com/questions/3222013/. – AlexC

+2

Jest to bardzo istotne pytanie, ponieważ nie chcę przeszkadzać moim użytkownikom w obejściu pojedynczej przeglądarki niezgodnej z normami. Chcę tylko tego "utf8 = ✓" dla kilku użytkowników IE, których mam. – Jarl

Odpowiedz

24

Nawet jeśli nie robią nic z parametrem, Rails jest. Ma to poprawić niektóre problemy w kodowaniu parametrów IE. Jehuda ma więcej informacji tutaj:

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

+1

Czy istnieje sposób, aby poprawić te problemy w kodowaniu parametrów IE, dodając niektóre ustawienia domyślne w moim kontrolerze lub cokolwiek innego? – grautur

+0

Nie jestem tego świadomy. – cdmwebs

0

Spróbuj tego w ApplicationController:

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

To nie działa, ponieważ ta metoda musi zwrócić wartość skrótu i ​​może teraz zwrócić np. 'zero'. Ale zmiana, aby zwrócić coś w stylu '{utf8: nil}' również nie przynosi pożądanego efektu. –

5

zrobiłem inicjator odkręcenia param od żądań GET. To oczywiście hack.

To idzie w 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 

Idealnie Szyny prawdopodobnie powinien mieć warunki do tego, a przynajmniej przepisywania extra_tags_for_form więc jest mniej brudny do poprawki.

+0

Właśnie zaktualizowałem powyższy kod do pracy z Railsami 3.2. –

10

Istnieje klejnot (utf8_enforcer_workaround) do stosowania parametru utf8 tylko w przeglądarkach niezgodnych ze standardami (lub jakiejkolwiek innej logice z tego powodu). Jest to przydatne, jeśli nie chcesz przeszkadzać swoim dobrze zachowującym się użytkownikom dzięki obejściom IE.

38

Kiedy zrozumiesz the purpose of the Rails UTF-8 param, iz jakiegoś powodu trzeba jeszcze, aby go usunąć, rozwiązanie jest prostsze niż myślisz ... po prostu nie używać form_tag pomocnika:

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

Pomogło mi to skonfigurować właściwość submit_tag, dziękuję! – Ikon

+0

Ale pomocnik 'form_tag' przynosi kilka innych funkcji! –

1

Korzystanie before_action i przekierowanie do innej akcji pracował dla mnie. Na przykład, jeśli szukasz wpisów, skonfiguruj trasę do wyszukiwania w kolekcji.

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

i wykonaj żądanie HTTP GET dla wpisów # akcja indeks.

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

a następnie w 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 

i nazywają Post.search w postach # Szukaj działania i renderowanie strony indeksu.

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

URL będzie wyglądać/postów/q wyszukiwania? = Foo

+1

Źle źle źle – Peter

Powiązane problemy