dvdt
dvdt

Reputation: 39

Ruby on Rails - Update multiple data in a table with select (bulk edit)

(Rail 5 beta 3)

I have a table on an index page (action) of a view with around 15 columns. Some of them are for text and some of them are for integers only. Every entry of this list (table) will be filled out by a 'form_for' form (in new or edit action).

For editing or deleting there are links with each list entry in the index view leading to the corresponding show, edit or destroy actions. This all works well. Some of these entries are entered by a select with pulldown on the new or edit view. This works well, too.

But if one of these selects should be changed for more than one entry in the list it takes too much time to click on 'edit', change the select and click on submit at each list item. To make this a better user experience I would like to be able to change the selects in the list (table) directly. It would be good to have the select/pulldown in place. The change of the state or choosen entry should than be saved in place as well or with an extra button ("save changes") above/below the table.

To say it in short: I want to update multiple entries in a table in an index view without editig each single entry via edit view. The dates will be changed by a select and the data should be saved by a submit button on this page

Has anybody an idea how I can solve this?

Upvotes: 0

Views: 2288

Answers (2)

GoGoCarl
GoGoCarl

Reputation: 2519

Your original text wasn't that confusing to me...

You want what's called a bulk edit feature. Easiest way would be to set up a new target at the controller level specifically to handle this request. I'll give you the pseudocode and it should be easy enough to fill in the blanks, but essentially:

  1. Create a "bulk edit" form (the drop down select menu above the table)
  2. Create a controller method to handle the bulk edit (controller#bulk)
  3. Update routes.rb to direct a URL to that new method
  4. Handle the bulk update in the controller and redirect back to index upon completion (cheap way of updating the page after editing is done).

Note: I'm assuming your model name is "Resource" because you did not specify what it actually was

On your index page, you want HTML like:

<form method="POST" action="/resources/bulk">
  <select name="bulk_value">...</select>
</form>

On change/form submit/whatever, submit that form.

If you're using resourceful routing, you can hook this into config.rb via:

resources :resources do
  post :bulk, on: :collection
end

Otherwise, hook the route however you see fit.

Then, in your controller:

def bulk
  value = params[:bulk_value]
  Resource.update_all value: value
  redirect_to {resources_path}
end

Now, you said index view, so I am assuming you want all. But if you just want a subset, you can pass the preferred IDs along with the form as a hidden field, then use a where clause to filter, i.e.

Resource.where(id: parmas[:id_array]).update_all(value: value)

Anyway, that should get you down the right path.

Upvotes: 1

sureshprasanna70
sureshprasanna70

Reputation: 1045

Try best_in_place gem. It can solve the problem you have quoted. here are some links to it https://github.com/bernat/best_in_place
http://railscasts.com/episodes/302-in-place-editing?view=asciicast

Upvotes: 2

Related Questions