Potrzebuję wielu przycisków przesyłania.
Mam formularz, który tworzy wystąpienie Contact_Call.
Jeden przycisk tworzy to normalnie.
Drugi przycisk tworzy go, ale musi mieć inną wartość atrybutu od domyślnej, a także musi ustawić atrybut na inny, ale powiązany model używany w kontrolerze.
W jaki sposób mogę to zrobić? Nie mogę zmienić trasy, więc czy istnieje sposób na wysłanie innej zmiennej, która jest pobierana przez [: params]?
A jeśli to zrobię, co mam zrobić w kontrolerze, założyć zestawienie przypadków?
ruby-on-rails
ruby
form-submit
Timothy T.
źródło
źródło
Odpowiedzi:
Możesz utworzyć wiele przycisków przesyłania i nadać każdemu inną wartość:
Spowoduje to wyświetlenie:
Wewnątrz Twojego kontrolera wartość przesłanego przycisku będzie identyfikowana przez parametr
commit
. Sprawdź wartość, aby wykonać wymagane przetwarzanie:Pamiętaj jednak, że to ściśle łączy twój pogląd z kontrolerem, co może nie być zbyt pożądane.
źródło
Istnieje również inne podejście, wykorzystujące atrybut formaction na przycisku przesyłania:
Kod pozostaje czysty, ponieważ standardowy przycisk tworzenia nie wymaga żadnych zmian, wystarczy wstawić ścieżkę routingu dla przycisku specjalnego:
źródło
Alternatywnie możesz rozpoznać, który przycisk został naciśnięty, zmieniając jego nazwę atrybutu.
Jest to trochę niewygodne, ponieważ musisz sprawdzić obecność klawiszy parametrów zamiast po prostu sprawdzić
params[:commit]
wartość: otrzymaszparams[:a_button]
lub wparams[:b_button]
zależności od tego, który z nich został naciśnięty.źródło
Rozwiązanie podobne do sugerowanego przez @ vss123 bez użycia klejnotów:
Zauważ, że unikam używania wartości i zamiast tego używam nazwy wejściowej, ponieważ wartość przycisku przesyłania jest często umiędzynarodowiona / przetłumaczona. Unikałbym też używania tego zbyt często, ponieważ szybko zaśmieci to plik tras.
źródło
Rozwiązaliśmy za pomocą zaawansowanych ograniczeń w szynach.
Chodzi o to, aby mieć tę samą ścieżkę (a zatem tę samą nazwaną trasę i akcję), ale z ograniczeniami kierującymi do różnych akcji.
CommitParamRouting
to prosta klasa, która ma metodę,matches?
która zwraca wartość true, jeśli parametr zatwierdzenia jest zgodny z atrybutem danej instancji. wartość.Jest to dostępne jako gem commit_param_matching .
źródło
Stare pytanie, ale ponieważ miałem do czynienia z tą samą sytuacją, pomyślałem, że opublikuję swoje rozwiązanie. Używam stałych kontrolera, aby uniknąć rozbieżności między logiką kontrolera a przyciskiem widoku.
A potem w widoku:
W ten sposób tekst żyje tylko w jednym miejscu - jako stała w kontrolerze. Jednak nie próbowałem jeszcze wymyślić, jak to zrobić.
źródło
Mam zmienną liczbę przycisków przesyłania w moim formularzu dzięki nested_form_fields, więc samo użycie nazwy nie było dla mnie wystarczające. Skończyło się na tym, że włączyłem ukryte pole wejściowe do formularza i użyłem JavaScript do wypełnienia go, gdy naciśnięto jeden z przycisków przesyłania formularza.
źródło