form_for aber auf eine andere Aktion posten

122

Ich möchte eine form_for @user, aber eine benutzerdefinierte Aktion im Controller des Benutzers veröffentlichen.

Wie kann ich das machen?

Blankman
quelle

Antworten:

177
form_for @user, :url => url_for(:controller => 'mycontroller', :action => 'myaction')

oder

form_for @user, :url => whatever_path
Austin
quelle
15
Ich denke nicht, dass url_fores notwendig ist. Auch da Controller der gleiche ist, könnten Sie verwendenform_for @user, :url => :action => 'myaction'
Rubyprince
1
Die obige Antwort war hilfreich, aber ich musste sie ein wenig optimieren, da sonst der POST immer an die Aktion zum Bearbeiten des Controllers weitergeleitet wurde. Andernfalls: <% = form_for (@user, url: {action: "myaction"}, method :: post) do | user_form | %>. Bitte beachten Sie, dass dies für eine Ansichtsdatei im Ordner views / users / gilt.
AarCee
42

Folgendes funktioniert für mich:

form_for @user, :url => {:action => "YourActionName"}
Peter Lee
quelle
1
Das funktioniert. Überprüfen Sie es in den offiziellen Dokumenten, indem Sie nach action:( Aktionspunkt ) api.rubyonrails.org/classes/ActionView/Helpers/…
user664833
3
Hmm nicht sicher. Ich habe gesetzt, form_for @user, url: {action: 'myaction'}aber es gibt mir No route matches {:action=>"myaction", :controller=>"users"}Fehler.
Lulalala
@lulalala, natürlich müssen Sie auch Routen festlegen. in diesem Fall wie:resources :users do collection do get :myaction end end
Tagaismus
11

Ich habe es so gemacht

<%= form_for :user, url: {action: "update", params: {id: @user.id}} do |f| %>

Beachten Sie den optionalen Parametersatz idfür das Benutzerinstanz-ID-Attribut.

Szymon Błaszczyński
quelle
4

Alternativ kann dasselbe form_tagmit der folgenden Syntax erreicht werden:

form_tag({controller: "people", action: "search"}, method: "get", class: "nifty_form")
# => '<form accept-charset="UTF-8" action="/people/search" method="get" class="nifty_form">'

Wie unter http://guides.rubyonrails.org/form_helpers.html#multiple-hashes-in-form-helper-calls beschrieben

juliangonzalez
quelle
Dies ist wahr, aber die Frage fragt nach einem bestimmten Objekt - in diesem Fall @user. Durch die Verwendung von a form_tagwerden die Attribute des Objekts nicht an die Formularfelder gebunden.
Dylan Pierce
3

Wenn Sie beim Rendern eines Teilformulars einen benutzerdefinierten Controller an form_for übergeben möchten, können Sie Folgendes verwenden:

<%= render 'form', :locals => {:controller => 'my_controller', :action => 'my_action'}%>

und dann in der Form teilweise diese lokale Variable wie folgt verwenden:

<%= form_for(:post, :url => url_for(:controller => locals[:controller], :action => locals[:action]), html: {class: ""} ) do |f| -%>
Aditya Anand Krishna
quelle
3

neue Syntax

<%= form_for :user, url: custom_user_path, method: :post do |f|%>
<%end%>
gsumk
quelle