2010-11-16 26 views
6

Tôi có một button_to mà tôi muốn thực hiện một hành động PUT (chỉ có một điều có thể được cập nhật về tài nguyên này - nó sẽ được cập nhật là 'được thừa nhận' , do đó, không có trường biểu mẫu nào khác được liên kết với việc kích hoạt hành động).Rails3 button_to đang gọi hành động POST, cố gắng gọi hành động PUT

Đây là quan điểm của tôi (bộ điều khiển được đưa ra một cách rõ ràng bởi vì nút là trên quan điểm cho rằng thuộc về bộ điều khiển khác):

<%= button_to "Acknowledged", :controller => 'practice_sessions', :id => @practice_session.id, :method => :put %> 

Trong tập tin tuyến đường của tôi, các tài nguyên đã được khai báo là một nguồn tài nguyên yên tĩnh :

resources :practice_sessions 

Bộ điều khiển cho tài nguyên này có tác vụ tạo và cập nhật và nút ở trên gọi hành động tạo. Tôi muốn nó gọi hành động cập nhật.

này đi kèm thông qua các bản ghi ngay trước khi đám cháy hành động tạo ra:

Started POST "/practice_sessions?id=21&method=put" for 127.0.0.1 at 2010-11-17 08:52:46 +0000 
    Processing by PracticeSessionsController#create as HTML 
    Parameters: {"authenticity_token"=>"1EW0IlI38d0f4wST5azrCEZVZPfih7i0UvCGSF7eqbc=", "id"=>"21", "method"=>"put"} 

Trả lời

17

cú pháp của bạn là hơi off. button_to lấy ba đối số: tiêu đề nút, mã băm options và mã băm html_options. :method=>:put cần phải đi theo số html_options, trong khi thông số tuyến đường cần phải đi theo số options. Vì vậy, bạn có thể viết lại như sau:

<%= button_to "Acknowledged", { :controller => 'practice_sessions', 
    :id => @practice_session.id}, 
    :method => :put %> 

Khi nhấn vào các yêu cầu cần được xử lý bởi PracticeSessionsController#update

+0

Xin chào, cảm ơn vì điều này. Tôi hiện đang nhận được 'Không có kết quả phù hợp với tuyến đường'/tập_tập_kiếm ''. Tôi nghĩ rằng đó là bởi vì nó PUTting chỉ/practice_sessions (như được chứng kiến ​​bởi URL http: // localhost: 3000/practice_sessions? Id = 26) chứ không phải là/practice_sessions/26 trong trường hợp này. Tôi sẽ tiếp tục chơi với nó, nhưng mọi lời khuyên đều được đánh giá cao! – pakeha

+0

Đầu ra của 'các tuyến đường rake' là gì? – zetetic

+0

Có vẻ như mong đợi. Dưới đây là những dòng tôi tưởng tượng được quan tâm: practice_session PUT /practice_sessions/:id(.:format) {: action => "update",: controller => "practice_sessions"} practice_sessions POST/practice_sessions (. Định dạng) {: action => "create",: controller => "practice_sessions"} – pakeha

1

Bạn có thể cần phải vượt qua một cách rõ ràng đối số :method => :put trong html_options băm - nó có thể bị globbed vào options băm .

Hãy thử điều này:

<%= button_to "Acknowledged", { :controller => 'practice_sessions', :id => @practice_session.id }, :method => :put %> 

(Lưu ý niềng răng rõ ràng xung quanh :controller:id)

+0

Hey, điều này sẽ không làm việc cho tôi (xem phản ứng của tôi để zetetic), nhưng tôi đã kết thúc giải quyết nó bằng cách sử dụng các tuyến đường được đặt tên (xem câu trả lời của tôi). Cảm ơn cho đầu vào của bạn mặc dù - Tôi nên đã nhận thấy các đối số riêng biệt anyway. – pakeha

1

Cuối cùng tôi quyết định đi với cách tiếp cận ngon hơn sử dụng tên các tuyến đường, mà dường như làm việc tốt. Tôi vẫn không chắc chắn 100% lý do tại sao phương pháp khác sẽ không hoạt động, nhưng tôi không nghĩ rằng nó quan trọng bởi vì điều này có vẻ như cả một) gọn gàng hơn và b) thông thường hơn.

<%= button_to "Acknowledge", practice_session_path(@practice_session), :method => :put %> 
Các vấn đề liên quan