Concept Flow - Before and after filters
Request received
Run before filters
Run controller action
Run after filters
Send response
Rails runs before filters first, then the action, then after filters before sending the response.
class PostsController < ApplicationController before_action :authenticate_user after_action :log_action def show # show post end end
| Step | Filter/Action | When Run | Effect | Notes |
|---|---|---|---|---|
| 1 | authenticate_user | Before action | Checks user login | Prevents action if not logged in |
| 2 | show | Action | Displays post | Main controller method |
| 3 | log_action | After action | Logs action details | Runs after action, before response sent |
| 4 | Response sent | After filters done | Sends page to user | End of request cycle |
| Variable | Start | After before_action | After action | After after_action | Final |
|---|---|---|---|---|---|
| user_authenticated | nil | true or false | true or false | true or false | true or false |
| response_ready | false | false | true | true | true |
| log_written | false | false | false | true | true |
Rails filters run in order: - before_action: runs before controller method, used for checks - controller action: main code for request - after_action: runs after action, used for logging or cleanup Filters help organize code around actions cleanly.
before_action filter in a Rails controller?before_actionbefore_action runs code before the main action method executes.log_action in a Rails controller?after_action to define code that runs after controller actions.after_filter. after_action :log_action uses correct after_action. before_action :log_action is for before filters. after :log_action is invalid syntax.class PostsController < ApplicationController
before_action :set_post
after_action :log_post
def show
render plain: @post.title
end
private
def set_post
@post = Post.find(params[:id])
end
def log_post
Rails.logger.info "Post viewed: #{@post.id}"
end
endGET /posts/5 is called, assuming the post with ID 5 has title "Hello"?before_action :set_post runs before show, setting @post. after_action :log_post runs after show completes.show runs, @post is set, so render plain: @post.title outputs "Hello". After rendering, log_post logs "Post viewed: 5".class UsersController < ApplicationController
before_action :authenticate_user
after_action :clear_session
def index
# list users
end
private
def authenticate_user
redirect_to login_path unless current_user
end
def clear_session
session[:temp] = nil
end
endauthenticate_user redirects, the action does not run, but after_action still runs.clear_session after redirect can cause unexpected side effects or errors.before_action filter named check_admin only before the edit and update actions in a Rails controller. Which is the correct way to write this?before_action to run code before actions. Use only: to limit to specific actions.before_action with only: [:edit, :update]. before_action :check_admin, except: [:edit, :update] uses except, which excludes those actions. after_action :check_admin, only: [:edit, :update] uses after_action, wrong timing. before_filter :check_admin, only: [:edit, :update] uses deprecated before_filter.Pass the test and this pattern moves unknown