2012-02-16 34 views
20

Tôi mới sử dụng Rails và tôi đang cố gắng sử dụng trình trợ giúp link_to để tạo liên kết đưa ra yêu cầu PUT thay vì yêu cầu GET. Cụ thể, tôi đang cố gắng tạo liên kết kích hoạt tài khoản của người dùng trong ứng dụng của tôi từ bảng điều khiển của quản trị viên. Tôi đang sử dụng Rails 3.0.5.Ruby on Rails link_to Với phương thức

tập tin routes.rb của tôi có:

match '/admin/users/:id/activate' => 'admin#activate_user', 
    :action => :activate_user, :via => :put 

Quan điểm của tôi có:

link_to 'Activate', :action => :activate_user, :id => user.id, :method => :put 

Tuy nhiên điều này sẽ tạo URL (ví dụ) /admin/users/7/activate?method=put với mã nguồn <a href="/admin/users/7/activate?method=put">Activate</a>.

Tôi muốn tạo ra, thay vào đó, <a href = "/admin/users/7/activate" data-method="put">Activate</a>

Tôi nhận ra tôi có thể sử dụng button_to, nhưng tôi đã vật lộn với vấn đề này trong một thời gian và tôi đang bối rối vì sao tôi nhìn thấy hành vi này, khi các hướng dẫn khác nói rằng những gì tôi đang làm nên hợp lệ. Làm thế nào tôi có thể đi về việc tạo ra một link_to helper với hành vi tôi muốn?

Trả lời

25

Cập nhật - Trình trợ giúp link_to sẽ thực hiện GET trừ khi phương thức được chỉ định.

Tốt hơn là chỉ định loại yêu cầu chính xác, thay vì match trong tệp tuyến đường của bạn. Làm thế nào về thay thế match bởi put trong các tuyến đường như:

put '/admin/users/:id/activate' => 'admins#activate_user', :as => 'activate_user' 

link_to 'Activate', activate_user_path(user.id), method: :put 

Phương pháp activate_user nên cư trú tại admins điều khiển. Số docs có thêm thông tin về số link_to trợ giúp.

+1

các tuyến đường rake sản xuất cho đường dẫn đặt ở trên là gì ?? Bạn có thể đăng nó không? – prasvin

+1

Công trình này, cảm ơn! Và đó là giải pháp sạch nhất :) – maksim

+4

Điều này không hiệu quả đối với tôi. Nếu không có phương thức nào được định nghĩa trong link_to, tôi sẽ nhận được thông báo lỗi No route matches [GET]. – ndemoreau

30

link_to nghĩ rằng :method => :put là một phần của đường dẫn băm. Bạn phải nói điều đó bằng cách khác. Quấn đường đi của bạn trong dấu ngoặc vuông.

link_to 'Activate', {:action => :activate_user, :id => user.id}, :method => :put 

Bây giờ link_to sẽ nhận ra :method => :put như một tùy chọn, không phải là một phần của con đường của liên kết.

Như một lưu ý phụ, bạn nên cố gắng sử dụng người trợ giúp tuyến đường thay vì đường dẫn băm bất cứ khi nào có thể. Giữ cho mọi thứ tốt đẹp và ngăn nắp, và tránh những tình huống khó khăn như thế này.