55

Tôi có một liên kết mà tôi cần gửi yêu cầu đăng bài. Thông thường, tôi muốn sử dụng jQuery và ngăn chặn hành vi mặc định của liên kết và sau đó gửi biểu mẫu đến đích. Điều này có vẻ như một cái gì đó Rails sẽ có thể giúp tôi với. Chắc chắn, phương pháp link_to có một tùy chọn để chỉ định một phương thức POST http:Sử dụng Rails link_to cho các liên kết đăng

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

đó làm việc, nhưng tôi cần phải thêm 2 thông số quá. Tôi cố gắng:

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

Đó chỉ thêm những tham số cho các phần tử HTML <a>, nhưng không nộp những khi nhấn vào liên kết:

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

Có cách nào để làm một yêu cầu POST với các thông số sử dụng link_to hoặc bất kỳ phương pháp Rails nào khác? Tôi đang sử dụng Rails 3.2.9.

+0

đừng nghĩ rằng bạn có thể làm điều đó. có lẽ tốt nhất làm điều đó trong bộ điều khiển của bạn với net/http hoặc HTTParty? –

+0

Không thể làm điều đó trong bộ điều khiển của tôi, người dùng cần phải được chuyển hướng đến trang web khác. Có vẻ như bạn nói đúng, không có cơ chế liên kết tích hợp để làm điều này cho tôi. –

Trả lời

94

Câu trả lời ngắn gọn là nếu ý bạn là "thông số" là trường biểu mẫu, thì bạn không thể làm điều này (ít nhất là không theo cách đơn giản mà tôi có thể thấy). Thay vào đó, bạn nên sử dụng biểu mẫu có nút gửi, được tạo kiểu để trông giống như một liên kết (nếu đó là những gì bạn muốn nó giống như).

Nếu mặt khác bạn đã có nghĩa là truy vấn thông số, sau đó điều này sẽ làm việc:

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

Chỉ cần cập nhật câu hỏi của tôi, tôi thực sự đang sử dụng URL bên ngoài cho các liên kết này. –

+0

Tôi đã thêm một lưu ý về cơ bản nói rằng những gì bạn muốn làm là không thể sử dụng một liên kết. Bạn cần một biểu mẫu có nút gửi. –

+2

Điều quan trọng cần lưu ý là nếu người dùng đã tắt javascript, liên kết sẽ mặc định là yêu cầu "NHẬN". – bkunzi01

9

Bạn có thể mã hóa các thông số trong URL theo cách này:

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

Nếu không phù hợp với nhu cầu của bạn, bạn nên sử dụng một biểu mẫu tốt hơn là link_to.

+0

Đây thực sự là một cách rất hay để thêm các tham số. – nathanvda

+0

Không hoạt động cho các nhu cầu của tôi, các thông số cần phải là thông số POST. Nhưng cảm ơn, tôi không biết về phương pháp to_param. Bạn cũng cần một '?' Sau hồ sơ. –

+0

Ok Tôi hiểu rồi, tôi nghĩ bạn phải viết một biểu mẫu. Bạn có thể viết một phương thức trợ giúp sẽ xây dựng biểu mẫu này nếu bạn cần lặp lại logic này nhiều lần. –

1

Để đăng dữ liệu, bạn cần một biểu mẫu. Tuy nhiên, bạn không cần nút gửi. Nếu bạn muốn điều này giống như một liên kết vì một lý do nào đó, bạn thực sự có thể tạo liên kết gửi biểu mẫu qua JavaScript. Trong ví dụ dưới đây, tài nguyên POST chỉ là một hành động REST không yêu cầu bất kỳ trường nào, do đó không có điều khiển đầu vào biểu mẫu nào. Nếu bạn muốn đăng một số dữ liệu, chỉ cần đặt các trường nhập ẩn trong biểu mẫu.

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

Hình thức được gán một lớp học, do đó bạn có thể tạo kiểu nó hay giấu nó qua CSS (ví dụ như 'display: inline')

1

Các thông số và phương pháp http nên được với nhau {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %> 
0

Lưu ý rằng nếu người dùng đã tắt JS hoặc bạn đã xóa các thư viện JS không phô trương theo mặc định, link_to sẽ được gửi âm thầm qua yêu cầu GET.

Nói chung, tôi không thích các liên kết thực hiện yêu cầu POST. Tôi nghĩ đó là vai trò của một hình thức và một nút bấm.

Như vậy, một cách dễ dàng (và an toàn hơn) thay thế là sử dụng Rails button_to helper:

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

button_to cũng hỗ trợ tùy chọn method nhưng vì nó mặc định là post vì vậy tôi đã chỉ cần bỏ qua nó.

Các vấn đề liên quan