2011-08-13 14 views
7

Jak przekazać URL do formularza do przedłożenia? Próbuję użyć jednego formularza z każdym przyciskiem wskazującym na akcje kontrolera, jeden to wyszukiwanie, a drugi to tworzenie. Czy możliwe jest posiadanie 2 przycisków przesyłania z różnymi czynnościami w tym samym formularzu?form_for z działaniami dla wielu kontrolerów do przesłania

<%= form_for @people do |f| %> 
    <%= f.label :first_name %>: 
    <%= f.text_field :first_name %><br /> 

    <%= f.label :last_name %>: 
    <%= f.text_field :last_name %><br /> 

    <%= f.submit(:url => '/people/search') %> 
    <%= f.submit(:url => '/people/create') %> 
<% end %> 

Odpowiedz

20

Nie istnieje prosty sposób Rails, aby przesłać formularz do różnych adresów URL w zależności od naciśniętego przycisku. Możesz użyć javascript na każdym przycisku, aby przesłać do różnych adresów URL, ale najczęściej stosowanym sposobem radzenia sobie z tą sytuacją jest zezwolenie na przesłanie formularza do jednego adresu URL i wykrycie, który przycisk został naciśnięty w akcji kontrolera.

Na drugim podejściu z przyciski przesyłania takich jak ten:

<%= form_for @people do |f| %> 
    # form fields here 
    <%= submit_tag "First Button", :name => 'first_button' %> 
    <%= submit_tag "Second Button", :name => 'second_button' %> 
<% end %> 

Twoje działanie będzie wyglądać mniej więcej tak:

def create 
    if params[:first_button] 
    # Do stuff for first button submit 
    elsif params[:second_button] 
    # Do stuff for second button submit 
    end 
end 

this similar question Zobacz więcej na temat obu podejść.

Zobacz także Railscast episode 38 w przypadku formularzy wielobajtowych.

+1

Zgadzam się, utrzymuj rzeczy proste, korzystaj z natywnego podejścia, ** js ** może zarządzać * adresem akcji *. Proponuję użyć innego formularza do wyszukiwania z dopasowanym CSS do zmiany położenia – Anatoly

2

To pytanie jest bardzo podobny do this one, choć jest to nieco inna

Chciałem higlight że część odpowiedzi na pytanie aforementionned zaproponował także, aby dodać ograniczenia do tras, więc można rzeczywiście trasa zapytania do różne działania kontrolerów!

kuponów autora, vss123

Rozwiązaliśmy użyciu zaawansowanych ograniczeń w szynach.

Chodzi o to, aby mieć tę samą ścieżkę (i tym samym o tej samej nazwie, określona trasa o nazwie & ), ale z ograniczeniami routowania do różnych działań.

resources :plan do 
    post :save, constraints: CommitParamRouting.new("Propose"), action: :propose 
    post :save, constraints: CommitParamRouting.new("Finalize"), action: :finalize 
end 

CommitParamRouting to prosta klasa, która ma mecze metoda? który zwraca wartość true, jeśli parametr zatwierdz pasuje do podanej instancji attr. wartość.

Dostępne jako gem commit_param_matching.

+0

Należy zauważyć, że w przeciwieństwie do odpowiedzi opartych na JS, które zastępują adres URL formularza, ta metoda polega wyłącznie na zapleczu i będzie działać nawet dla klientów, którzy wyłączyli javascript –

Powiązane problemy