digraph systemModel { rankdir="LR"; splines="line"; subgraph _clusterModels { label="Models" node[shape="record"]; BaseModel[label="<main> ActiveRecord::Base (abstract)"] User[label="<main> User | <attr_role> role | <attr_pw> password hash"]; } subgraph _clusterControllers { label="Controllers"; node[shape="record"]; ApplicationController[label="<main> ApplicationController (abstract)"]; MainController[label="<main> MainController | <index> show_homepage() | <edit> edit_settings() | <update> update_settings()"]; TournamentsController[label="<main> TournamentsController | <index> index() | <new> new() | <create> create() | <show> show() | <edit> edit() | <update> update() | <end> end()"]; MessagesController[label="<main> MessagesController"]; LoginController[label="<main> LoginController | <login> login() | <logout> logout()"]; SearchController[label="<main> SearchController"]; UsersController[label="<main> UsersController"]; MatchesController[label="<main> MatchesController"]; } subgraph _clusterViews { label="views/"; node[shape="rectangle"] layouts_application[label="layouts/application.html (abstract)"] subgraph clusterViewsCommon { label="views/common/"; common_permission_denied; common_invalid; } subgraph clusterViewsMain { label="views/main/"; main_homepage; main_edit; } subgraph clusterViewsTournament { label="views/tournament/"; tournaments_index; tournaments_new; tournaments_show; tournaments_edit; } subgraph clusterViewsMessages { label="views/messages/"; messages_private; messages_new_alert; } } subgraph inheritance { edge[arrowhead="onormal"]; MainController:main -> ApplicationController; ApplicationController -> MainController:main[style=invis]; TournamentsController:main -> ApplicationController; ApplicationController -> TournamentsController:main[style=invis]; MessagesController:main -> ApplicationController; ApplicationController -> MessagesController:main[style=invis]; LoginController:main -> ApplicationController; ApplicationController -> LoginController:main[style=invis]; SearchController:main -> ApplicationController; ApplicationController -> SearchController:main[style=invis]; UsersController:main -> ApplicationController; ApplicationController -> UsersController:main[style=invis]; MatchesController:main -> ApplicationController; ApplicationController -> MatchesController:main[style=invis]; } subgraph controller2view { layouts_application -> LoginController:login; layouts_application -> LoginController:logout; MainController:index -> main_homepage; MainController:edit -> main_edit -> MainController:update; MainController:edit -> common_permission_denied; MainController:update -> main_edit; MainController:update -> common_permission_denied; TournamentsController:index -> tournaments_index; TournamentsController:new -> tournaments_new -> TournamentsController:create; TournamentsController:create -> tournaments_edit -> TournamentsController:end; TournamentsController:show -> tournaments_show; TournamentsController:edit -> tournaments_edit -> TournamentsController:update; TournamentsController:update -> tournaments_edit TournamentsController:edit -> common_permission_denied; TournamentsController:end -> common_permission_denied; MessagesController -> messages_private; MessagesController -> messages_new_alert; LoginController:login -> common_permission_denied; LoginController:logout -> common_invalid; } }