Question

In my app I'm trying to implement trash for some objects, i.e. there will be column "trashed" and it'll set to date, when the object was trashed. Trash also has an index page, where users can restore objects - set "trashed" to nil.

I found examples of models with method trash!, that set trashed to date and it was implemented with Concerns. But I don't really understand how to implement controllers with action to_trash? Is there any way to use Concerns with controllers too or every controller should have it's own action and route for calling it?

Now I implemented it with controller Trash, that have action move_to_trash and every controller use this action, but I have to add get params trashable_id and trashable_type to do this. Is it a good way to do things?

Was it helpful?

Solution

I think the simplest implementation could be to add to your routes.rb file the following:

match ':controller/:id/trash', :action => :trash

This will allow you to use the action trash on every controller. Have a look at the Routing Rails Guide for more examples.

A simple implementation is the following (taking the model Report as example). I don't use Concern here:

class ReportsController < ApplicationController
  def trash
    @report = Report.find(params[:id])
    <Do the trashing of report here, you know that already.>
    # Decide what to do after having called #trash
    respond_to do |format|
      format.html { redirect_to(reports_url) }
    end
  end
end

If you have only some controllers that should allow the action, it is perhaps easier to add special routes rules for each controller, instead of adding it to every one. And if you want to go a step beyond, you may implement the trash action in a mixin, and mix it in the controller you want to have it in (and no, I don't will implement that, too).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top