Gönderen bağlantılar için Rails link_to kullanma


86

Gönderi talebinde bulunmam gereken bir bağlantı var. Normalde jQuery kullanır ve bağlantının varsayılan davranışını engeller ve ardından hedefe bir form gönderirim. Bu, Rails'in bana yardımcı olması gereken bir şey gibi görünüyor. Elbette, link_toyöntemin bir POST http yöntemi belirtme seçeneği vardır:

link_to "Profile", 'http://example.com/profile', method: :post

Bu işe yarıyor, ancak 2 parametre eklemem gerekiyor. Denedim:

link_to "Profile", 'http://example.com/profile', method: post, param1: 'value1', param2: 'value2'

Bu, yalnızca bu parametreleri <a>HTML öğesine ekledi , ancak bağlantıya tıklandığında göndermedi:

<a rel="nofollow" param1="value1" param2="value2" data-method="post" href="http://example.com/profile">Profile</a>

Parametreleri kullanarak link_toveya başka bir Rails yöntemi kullanarak POST isteği yapmanın bir yolu var mı ? Rails 3.2.9 kullanıyorum.


bunu yapabileceğini sanma. muhtemelen bunu denetleyicinizde net / http veya HTTParty ile yapmak en iyisidir?
Mike Campbell

Denetleyicimde yapamıyorum, kullanıcının diğer siteye yönlendirilmesi gerekiyor. Görünüşe göre haklısın, bunu benim için yapacak yerleşik bir bağlantı mekanizması yok.
içinde.

Yanıtlar:


143

Kısa cevap, eğer "parametreler" ile kastettiğiniz form alanları ise, bunu yapamazsınız (en azından benim görebildiğim kadar basit bir şekilde değil). Bunun yerine, bağlantı gibi görünecek şekilde tasarlanmış gönder düğmesi olan bir form kullanmalısınız (benzemesini istediğiniz şey buysa).

Öte yandan , sorgu parametrelerini kastetmişseniz , bu işe yarar:

link_to "Profile", profile_path(@profile.id, param1: 'value1', param2: 'value2'), method: :post

1
Sorum az önce güncelledi, aslında bu bağlantılar için harici bir URL kullanıyorum.
içinde.

Temel olarak, yapmak istediğiniz şeyin bir bağlantı kullanarak mümkün olmadığını söyleyen bir not ekledim. Gönder düğmeli bir forma ihtiyacınız var.
Chris Salzberg

3
Bir kullanıcı javascript'i devre dışı bıraktıysa, bağlantının varsayılan olarak bir "GET" isteğine dönüşeceğini unutmamak önemlidir.
bkunzi01

9

URL'deki parametreleri şu şekilde kodlayabilirsiniz:

link_to "Profile", 'http://example.com/profile?' + {param1: 'value1', param2: 'value2'}.to_param, method: :post

İhtiyaçlarınıza uymuyorsa, bir form kullanmaktan daha iyi olursunuz link_to.


Bu, parametreleri eklemenin gerçekten çok güzel bir yoludur.
nathanvda

İhtiyaçlarım için çalışmıyor, parametrelerin POST parametreleri olması gerekiyor. Ama teşekkürler, to_param yöntemini bilmiyordum. Ayrıca bir ?after profile de ihtiyacınız var .
içinde.

Tamam anlıyorum, o zaman bir form yazman gerektiğini düşünüyorum. Bu mantığı birkaç kez tekrarlamanız gerekirse, bu formu oluşturacak yardımcı bir yöntem yazabilirsiniz.
Adrien Coquio

1
Bu, OP'nin sorusunu cevaplamasa da, @ shioyama'nın cevabında olduğu gibi bunun için bir url yardımcısı kullanmalısınız
Ben West

@BenWest: Yardımcı başlangıçta kullanılmadı ve anlamlı olduğunu varsaydım (örneğin harici bir URL olabilir)
Adrien Coquio

3

Kullanıcı JS'yi devre dışı bıraktıysa veya varsayılan olarak gelen göze çarpmayan JS kitaplıklarının link_tosessizce bir GETistek aracılığıyla gönderileceğini unutmayın .

Genel olarak, POSTistekleri gerçekleştiren bağlantılara sahip olmaktan pek hoşlanmıyorum . Bence bu bir form ve düğmenin rolü.

Bu nedenle, kolay (ve daha güvenli) bir alternatif yardımcı olmak için Rails button_to kullanmaktır :

button_to 'Profile', profile_path(@profile, param1: 'value1', param2: 'value2')

button_tomethodseçeneği de destekliyor ancak varsayılan olduğu için onu atladım post.


Kostas ile anlaştı. Ayrıca, yöntem gönderimi içeren link_to, Internet Explorer'da iyi çalışmaz.
Pierre-Yves O.

1

POST verisi için bir forma ihtiyacınız var. Ancak, bir gönder düğmesine ihtiyacınız yoktur. Bunun herhangi bir nedenle bir bağlantı gibi görünmesini istiyorsanız, aslında bunu JavaScript aracılığıyla formu gönderen bir bağlantı yapabilirsiniz. Aşağıdaki örnekte, POST kaynağı yalnızca herhangi bir alan gerektirmeyen bir REST eylemidir, bu nedenle hiçbir form girişi denetimi yoktur. Bazı verileri göndermek istiyorsanız, forma gizli giriş alanları koyun.

<%= form_tag('http://something_postable', :method => :post, :class => 'internal') %></form>
<%= link_to_function('Label for Link', 'previous("form").submit()', :title => 'Hover text for link') %>

Biçimlendirebilmeniz veya CSS aracılığıyla gizleyebilmeniz için forma bir sınıf atanır (örneğin, 'display: inline')


1

Parametreler ve http yöntemi birlikte olmalıdır {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.