Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails: GoogleDocs-Style Autosave

I'm trying to build a Rails app in which you can edit the same model from several different locations on the page. I want changes to be saved automatically every X seconds, with an option of manually triggering a save.

I have come up with a solution, but it seems very complicated, and I assume other Rails users have already faced similar questions.

The solution I came up with, is to have a hidden form on my page that is the one actually submitted, and then have multiple "dummy" forms scattered around the page that update the hidden form.

Once submitted, the hidden form updates the model, and the model contains logic to determine which RJS files should be returned in response. These are bundled up and sent as an update response.

some limitations:

  • Can't wrap the whole page in one form tag (there are multiple models/controllers on the page)
  • The same field might be editable from multiple locations

Anyone have a more efficient way?

like image 316
shmichael Avatar asked Sep 06 '10 07:09

shmichael


1 Answers

  • create as much form as you need in your page even of the same instance of the same model
  • triggering the update would be either a javascript setInterval call, or onblur on your form fields.
  • your controller should be a REST one, and it will return success or error messages in json variables and a HTTP status (200, 422)
  • Forget rjs, think client side. Each form in your page will be submitting the form to the update method of your controller. The javascript submitting the form will have a error or success callback which will then show the success or error messages. The idea is that the javascript sending the form "knows" which form it is currently submitting, and it should be able to show error or success by itself dependending of the form it is submitting, it's not the controller job.
  • Saving the whole page is just serializing all the fields from all the forms and sending it to the update method. (see serialize)
like image 154
hellvinz Avatar answered Sep 24 '22 22:09

hellvinz