Search code examples
ruby-on-railscapybara

Clicking a link with data-method="POST" in Capybara


It seems it's not possible to send a POST-request with Capybara, even if that should be the direct result of a user action. For example, having a link with data-method="POST", and subsequently clicking that link raises a server error for me:

No route matches [GET] "blabla"

Which makes sense, given that it should be a PUT-request (as specified in its attributes). Found some related posts about Capybara's inability to directly send POST-requests, but none about links with the data-method attribute set.


Solution

  • Using "data-method" relies on using the Rails Unobtrusive Javascript Driver to create a discrete form and post it to the server. If Rails UJS is not running properly or the client does not support JS a normal GET request will be sent instead - it is after all just a link and browsers send GET requests when you click links.

    Capybara by default uses the RackTest driver which does not run javascript. Its not actually a real browser - its more like a browser simulator running on top of an XML parser.

    You need to either use button_to instead which creates an actual form element and which does not rely on JS at all or change the Capybara driver to a driver that runs javascript such as Selenium Webdriver or Apparition.