Sử dụng Rails link_to cho các liên kết đăng bài


85

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 sẽ sử dụng jQuery và ngăn hành vi mặc định của liên kết, sau đó gửi biểu mẫu đến đích. Đây có vẻ như là thứ mà Rails có thể giúp tôi. Chắc chắn, link_tophương thức có một tùy chọn để chỉ định phương thức POST http:

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

Điều đó hoạt động, nhưng tôi cũng cần thêm 2 tham số. Tôi đã thử:

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

Điều đó chỉ thêm các tham số đó vào <a>phần tử HTML, nhưng không gửi các tham số đó khi nhấp 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 để thực hiện một yêu cầu POST với các tham số bằng cách sử dụng link_tohoặc bất kỳ phương thức Rails nào khác không? Tôi đang sử dụng Rails 3.2.9.


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

Không thể làm điều đó trong bộ điều khiển của tôi, người dùng cần đượ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 nào để thực hiện việc này cho tôi.
tại.

Câu trả lời:


143

Câu trả lời ngắn gọn là nếu những gì bạn có nghĩa là "tham số" là các trường biểu mẫu, thì bạn chỉ đơn giản là 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ó trông giống như vậy).

Mặt khác, nếu bạn muốn tham số truy vấn , thì điều này sẽ hoạt động:

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

1
Vừa cập nhật câu hỏi của tôi, tôi thực sự đang sử dụng một URL bên ngoài cho các liên kết này.
tại.

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ể thực hiện bằng cách sử dụng một liên kết. Bạn cần một biểu mẫu có nút gửi.
Chris Salzberg

3
Điều quan trọng cần lưu ý là nếu người dùng đã vô hiệu hóa javascript, liên kết sẽ mặc định là yêu cầu "GET".
bkunzi01

8

Bạn có thể mã hóa các tham 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 nó không phù hợp với nhu cầu của bạn, bạn nên sử dụng biểu mẫu hơn là a link_to.


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

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

Được rồi, 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.
Adrien Coquio

1
Mặc dù rằng điều này không trả lời câu hỏi của OP, bạn nên sử dụng một helper url cho điều này như trong câu trả lời @ shioyama của
Bến Tây

@BenWest: các helper đã không được ban đầu được sử dụng và tôi cho rằng đó là ý nghĩa (nó có thể là một URL bên ngoài ví dụ)
Adrien Coquio

3

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_tothì thư viện JS sẽ được gửi âm thầm thông qua một GETyêu cầu.

Nói chung, tôi không thích có các liên kết thực hiện POSTcác yêu cầu. Tôi nghĩ đó là vai trò của một biểu mẫu và một nút.

Do đó, một giải pháp thay thế dễ dàng (và an toàn hơn) là sử dụng Rails button_to helper:

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

button_tocũng hỗ trợ methodtùy chọn nhưng vì nó mặc định postnên tôi đã bỏ qua nó.


Đồng ý với Kostas. Hơn nữa, link_to với bài đăng phương pháp không hoạt động tốt trên Internet Explorer.
Pierre-Yves O.

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 liên kết này trông giống như một liên kết vì lý do nào đó, bạn thực sự có thể biến nó thành một liên kết gửi biểu mẫu qua JavaScript. Trong ví dụ bên dưới, 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 nên không có điều khiển nhập biểu mẫu. Nếu bạn muốn đăng một số dữ liệu, chỉ cần đặt các trường đầu vào ẩ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') %>

Biểu mẫu được gán một lớp để bạn có thể tạo kiểu hoặc ẩn nó qua CSS (ví dụ: 'display: inline')


1

Các tham số và phương thức http phải cùng nhau {param1: 'value1', param2: 'value2', :method: :post}

<%= link_to "Profile", profile_path(@profile), {param1: 'value1', param2: 'value2', method: :post} %>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.