form_for tetapi untuk memposting ke tindakan yang berbeda

122

Saya ingin memiliki form_for @user, tetapi memposting ke tindakan kustom di pengontrol pengguna.

Bagaimana saya bisa melakukan ini?

Blankman
sumber

Jawaban:

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

atau

form_for @user, :url => whatever_path
Austin
sumber
15
Saya rasa url_fortidak perlu. Juga karena pengontrolnya sama, Anda dapat menggunakanform_for @user, :url => :action => 'myaction'
rubyprince
1
Jawaban di atas sangat membantu tetapi saya harus mengubahnya sedikit karena jika tidak, POST selalu mengarahkan ke tindakan pengontrol edit jika tidak: <% = form_for (@user, url: {action: "myaction"}, metode:: post) lakukan | user_form | %>. Harap dicatat bahwa ini untuk file tampilan dalam folder views / users /.
AarCee
42

Pekerjaan berikut untuk saya:

form_for @user, :url => {:action => "YourActionName"}
Peter Lee
sumber
1
Ini bekerja. Lihat di dokumen resmi dengan mencari action:( aksi titik dua ) api.rubyonrails.org/classes/ActionView/Helpers/…
pengguna664833
3
Hmm tidak yakin. Saya telah menempatkan form_for @user, url: {action: 'myaction'}tetapi memberi saya No route matches {:action=>"myaction", :controller=>"users"}kesalahan.
lulalala
@lulalala, tentunya kamu juga harus mengatur rute. dalam hal ini, seperti:resources :users do collection do get :myaction end end
tagaism
11

Saya telah melakukannya seperti itu

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

Perhatikan parameter opsional yang iddisetel ke atribut id instance pengguna.

Szymon Błaszczyński
sumber
4

Atau, hal yang sama dapat dicapai form_tagdengan menggunakan sintaks:

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

Seperti yang dijelaskan dalam http://guides.rubyonrails.org/form_helpers.html#multiple-hashes-in-form-helper-calls

juliangonzalez
sumber
Ini benar, tetapi pertanyaannya menanyakan tentang objek tertentu - dalam hal ini @user. Menggunakan a form_tagtidak akan mengikat atribut objek ke bidang formulir.
Dylan Pierce
3

Jika Anda ingin meneruskan Pengontrol kustom ke form_for saat merender formulir parsial, Anda dapat menggunakan ini:

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

dan kemudian dalam bentuk parsial gunakan variabel lokal ini seperti ini:

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

sintaks baru

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