This took some serious Googling, but it has been useful in so many different projects.
Tags: Ruby on Rails
The first order of business here is to create the definition of the method within the controller for whatever change you're trying to make. So, if you're trying to authorize a
user then you would create something like the following:
class UsersController < ApplicationController def authorize @user = User.find(params[:id]) if @user.update_attributes(authorized: true) redirect_to :back flash[:notice] = "That user has been authorized!" else redirect_to root_path flash[:warning] = "Oops! Something went wrong!" end end end
It used to be
update_attribute in previous Rails versions, but at least with Rails 4 the plural is important or you'll get an error saying
wrong number of arguments (given 1, expected 2).
Then the new route needs to be added to
post "users/:id/authorize" => "users#authorize", as: "authorize"
There is a Stack Overflow post that deals with this same issue that says to use
match instead of
post, but this will now throw up an error to choose either
get, and in this instance we want to
post the information to the database, so there we go.
Lastly, the link to use in a view would be something like this:
<%= link_to "Authorize User", authorize_path(@user), method: :post %>
method: :post is necessary so it understands that you want to post the information to the database.
And there we go! I use this for archiving/unarchiving, marking things read/unread, and a variety of other useful boolean goodies.