Module: ApplicationHelper
- Includes:
- ViteHelper
- Included in:
- AccessTokensHelper, BlobPresenter, Gitlab::BlamePresenter, Integrations::Jira, MergeRequestWidgetEntity, Projects::NetworkController
- Defined in:
- app/helpers/application_helper.rb
Class Method Summary collapse
-
.community_forum ⇒ Object
This needs to be used outside of Rails.
-
.promo_host ⇒ Object
This needs to be used outside of Rails.
- .promo_url ⇒ Object
Instance Method Summary collapse
-
#active_when(condition) ⇒ Object
Returns active css class when condition returns true otherwise returns nil.
- #add_issuable_stylesheet ⇒ Object
- #add_page_specific_style(path) ⇒ Object
- #add_page_startup_api_call(api_path, options: {}) ⇒ Object
- #add_work_items_stylesheet ⇒ Object
- #admin_section? ⇒ Boolean
- #asset_to_string(name) ⇒ Object
- #autocomplete_data_sources(object, noteable_type) ⇒ Object
- #bluesky_url(user) ⇒ Object
- #body_data ⇒ Object
- #body_data_page ⇒ Object
- #client_class_list ⇒ Object
- #client_js_flags ⇒ Object
- #collapsed_super_sidebar? ⇒ Boolean
-
#community_forum ⇒ Object
Convenient method for Rails helper.
-
#conditional_link_to(condition, options, html_options = {}, &block) ⇒ Object
While similarly named to Rails’s ‘link_to_if`, this method behaves quite differently.
-
#current_action?(*args) ⇒ Boolean
Check if a particular action is the current one.
-
#current_controller?(*args) ⇒ Boolean
Check if a particular controller is the current one.
- #discord_url(user) ⇒ Object
- #dispensable_render ⇒ Object
- #dispensable_render_if_exists ⇒ Object
- #edited_time_ago_with_tooltip(editable_object, placement: 'top', html_class: 'time_ago', exclude_author: false) ⇒ Object
-
#error_css ⇒ Object
rubocop: enable CodeReuse/ActiveRecord.
- #external_storage_url_or_path(path, project = @project) ⇒ Object
-
#extra_config ⇒ Object
shortcut for gitlab extra config.
-
#gitlab_config ⇒ Object
shortcut for gitlab config.
- #gitlab_ui_form_for(record, *args, &block) ⇒ Object
- #gitlab_ui_form_with(**args, &block) ⇒ Object
-
#hexdigest(string) ⇒ Object
rubocop: enable CodeReuse/ActiveRecord.
- #hidden_resource_icon(resource, css_class: nil) ⇒ Object
- #instance_review_permitted? ⇒ Boolean
- #last_commit(project) ⇒ Object
- #linkedin_name(user) ⇒ Object
- #linkedin_url(user) ⇒ Object
- #locale_path ⇒ Object
- #mastodon_url(user) ⇒ Object
- #outdated_browser? ⇒ Boolean
- #page_class ⇒ Object
- #page_filter_path(options = {}) ⇒ Object
- #page_startup_api_calls ⇒ Object
- #partial_exists?(partial) ⇒ Boolean
- #path_to_key(key, admin = false) ⇒ Object
- #project_data ⇒ Object
-
#promo_host ⇒ Object
Convenient method for Rails helper.
- #promo_url ⇒ Object
-
#read_only_message ⇒ Object
Overridden in EE.
-
#registry_config ⇒ Object
shortcut for gitlab registry config.
-
#render_if_exists(partial = nil, **options) ⇒ Object
See docs.gitlab.com/ee/development/ee_features.html#code-in-appviews rubocop: disable CodeReuse/ActiveRecord We allow partial to be nil so that collection views can be passed in ‘render partial: ’some/view’, collection: @some_collection`.
- #show_callout?(name) ⇒ Boolean
-
#show_last_push_widget?(event) ⇒ Boolean
Define whenever show last push event with suggestion to create MR rubocop: disable CodeReuse/ActiveRecord.
- #sign_in_with_redirect? ⇒ Boolean
- #simple_sanitize(str) ⇒ Object
- #static_objects_external_storage_enabled? ⇒ Boolean
- #support_url ⇒ Object
- #system_message_class ⇒ Object
- #template_exists?(template) ⇒ Boolean
-
#time_ago_with_tooltip(time, placement: 'top', html_class: '', short_format: false) ⇒ Object
Render a ‘time` element with Javascript-based relative date and tooltip.
- #twitter_url(user) ⇒ Object
Methods included from ViteHelper
#universal_path_to_stylesheet, #universal_stylesheet_link_tag, #vite_enabled?, #vite_hmr_http_url, #vite_hmr_websocket_url, #vite_page_entrypoint_paths
Class Method Details
.community_forum ⇒ Object
This needs to be used outside of Rails
237 238 239 |
# File 'app/helpers/application_helper.rb', line 237 def self.community_forum 'https://forum.gitlab.com' end |
.promo_host ⇒ Object
This needs to be used outside of Rails
227 228 229 |
# File 'app/helpers/application_helper.rb', line 227 def self.promo_host 'about.gitlab.com' end |
.promo_url ⇒ Object
246 247 248 |
# File 'app/helpers/application_helper.rb', line 246 def self.promo_url "https://#{promo_host}" end |
Instance Method Details
#active_when(condition) ⇒ Object
Returns active css class when condition returns true otherwise returns nil.
Example:
%li{ class: active_when(params[:filter] == '1') }
349 350 351 |
# File 'app/helpers/application_helper.rb', line 349 def active_when(condition) 'active' if condition end |
#add_issuable_stylesheet ⇒ Object
442 443 444 445 |
# File 'app/helpers/application_helper.rb', line 442 def add_issuable_stylesheet add_page_specific_style('page_bundles/issuable') add_page_specific_style('page_bundles/notes_shared') end |
#add_page_specific_style(path) ⇒ Object
427 428 429 430 431 432 433 434 435 |
# File 'app/helpers/application_helper.rb', line 427 def add_page_specific_style(path) @already_added_styles ||= Set.new return if @already_added_styles.include?(path) @already_added_styles.add(path) content_for :page_specific_styles do universal_stylesheet_link_tag path end end |
#add_page_startup_api_call(api_path, options: {}) ⇒ Object
451 452 453 454 |
# File 'app/helpers/application_helper.rb', line 451 def add_page_startup_api_call(api_path, options: {}) @api_startup_calls ||= {} @api_startup_calls[api_path] = end |
#add_work_items_stylesheet ⇒ Object
437 438 439 440 |
# File 'app/helpers/application_helper.rb', line 437 def add_work_items_stylesheet add_page_specific_style('page_bundles/work_items') add_page_specific_style('page_bundles/notes_shared') end |
#admin_section? ⇒ Boolean
90 91 92 |
# File 'app/helpers/application_helper.rb', line 90 def admin_section? controller.class.ancestors.include?(Admin::ApplicationController) end |
#asset_to_string(name) ⇒ Object
483 484 485 486 487 488 489 490 |
# File 'app/helpers/application_helper.rb', line 483 def asset_to_string(name) app = Rails.application if Rails.configuration.assets.compile app.assets.find_asset(name).to_s else controller.view_context.render(file: Rails.root.join('public/assets', app.assets_manifest.assets[name]).to_s) end end |
#autocomplete_data_sources(object, noteable_type) ⇒ Object
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 |
# File 'app/helpers/application_helper.rb', line 456 def autocomplete_data_sources(object, noteable_type) return {} unless object && noteable_type if object.is_a?(Group) { members: members_group_autocomplete_sources_path(object, type: noteable_type, type_id: params[:id]), issues: issues_group_autocomplete_sources_path(object), mergeRequests: merge_requests_group_autocomplete_sources_path(object), labels: labels_group_autocomplete_sources_path(object, type: noteable_type, type_id: params[:id]), milestones: milestones_group_autocomplete_sources_path(object), commands: commands_group_autocomplete_sources_path(object, type: noteable_type, type_id: params[:id]) } else { members: members_project_autocomplete_sources_path(object, type: noteable_type, type_id: params[:id]), issues: issues_project_autocomplete_sources_path(object), mergeRequests: merge_requests_project_autocomplete_sources_path(object), labels: labels_project_autocomplete_sources_path(object, type: noteable_type, type_id: params[:id]), milestones: milestones_project_autocomplete_sources_path(object), commands: commands_project_autocomplete_sources_path(object, type: noteable_type, type_id: params[:id]), snippets: snippets_project_autocomplete_sources_path(object), contacts: contacts_project_autocomplete_sources_path(object, type: noteable_type, type_id: params[:id]), wikis: object.feature_available?(:wiki, current_user) ? wikis_project_autocomplete_sources_path(object) : nil } end end |
#bluesky_url(user) ⇒ Object
381 382 383 384 385 |
# File 'app/helpers/application_helper.rb', line 381 def bluesky_url(user) return '' if user.bluesky.blank? external_redirect_path(url: "https://bsky.app/profile/#{user.bluesky}") end |
#body_data ⇒ Object
134 135 136 137 138 139 140 141 142 |
# File 'app/helpers/application_helper.rb', line 134 def body_data { page: body_data_page, page_type_id: controller.params[:id], find_file: find_file_path(ref_type: @ref_type), group: @group&.path, group_full_path: @group&.full_path }.merge(project_data) end |
#body_data_page ⇒ Object
157 158 159 |
# File 'app/helpers/application_helper.rb', line 157 def body_data_page [*controller.controller_path.split('/'), controller.action_name].compact.join(':') end |
#client_class_list ⇒ Object
416 417 418 |
# File 'app/helpers/application_helper.rb', line 416 def client_class_list "gl-browser-#{browser_id} gl-platform-#{platform_id}" # rubocop:disable Tailwind/StringInterpolation -- Not a CSS utility class end |
#client_js_flags ⇒ Object
420 421 422 423 424 425 |
# File 'app/helpers/application_helper.rb', line 420 def client_js_flags { "is#{browser_id.titlecase}": true, "is#{platform_id.titlecase}": true } end |
#collapsed_super_sidebar? ⇒ Boolean
399 400 401 402 403 |
# File 'app/helpers/application_helper.rb', line 399 def return false if @force_desktop_expanded_sidebar ["super_sidebar_collapsed"] == "true" end |
#community_forum ⇒ Object
Convenient method for Rails helper
242 243 244 |
# File 'app/helpers/application_helper.rb', line 242 def community_forum ApplicationHelper.community_forum end |
#conditional_link_to(condition, options, html_options = {}, &block) ⇒ Object
While similarly named to Rails’s ‘link_to_if`, this method behaves quite differently. If `condition` is truthy, a link will be returned with the result of the block as its body. If `condition` is falsy, only the result of the block will be returned.
314 315 316 317 318 319 320 |
# File 'app/helpers/application_helper.rb', line 314 def conditional_link_to(condition, , = {}, &block) if condition link_to , , &block else capture(&block) end end |
#current_action?(*args) ⇒ Boolean
Check if a particular action is the current one
args - One or more action names to check
Examples
# On Projects#new
current_action?(:new) # => true
current_action?(:create) # => false
current_action?(:new, :create) # => true
86 87 88 |
# File 'app/helpers/application_helper.rb', line 86 def current_action?(*args) args.any? { |v| Gitlab::Utils.safe_downcase!(v.to_s) == action_name } end |
#current_controller?(*args) ⇒ Boolean
Check if a particular controller is the current one
args - One or more controller names to check (using path notation when inside namespaces)
Examples
# On TreeController
current_controller?(:tree) # => true
current_controller?(:commits) # => false
current_controller?(:commits, :tree) # => true
# On Admin::ApplicationController
current_controller?(:application) # => true
current_controller?('admin/application') # => true
current_controller?('gitlab/application') # => false
70 71 72 73 74 |
# File 'app/helpers/application_helper.rb', line 70 def current_controller?(*args) args.any? do |v| Gitlab::Utils.safe_downcase!(v.to_s) == controller.controller_name || Gitlab::Utils.safe_downcase!(v.to_s) == controller.controller_path end end |
#discord_url(user) ⇒ Object
375 376 377 378 379 |
# File 'app/helpers/application_helper.rb', line 375 def discord_url(user) return '' if user.discord.blank? "https://discord.com/users/#{user.discord}" end |
#dispensable_render ⇒ Object
22 23 24 25 26 27 |
# File 'app/helpers/application_helper.rb', line 22 def dispensable_render(...) render(...) rescue StandardError => e Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e) nil end |
#dispensable_render_if_exists ⇒ Object
29 30 31 32 33 34 |
# File 'app/helpers/application_helper.rb', line 29 def dispensable_render_if_exists(...) render_if_exists(...) rescue StandardError => e Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e) nil end |
#edited_time_ago_with_tooltip(editable_object, placement: 'top', html_class: 'time_ago', exclude_author: false) ⇒ Object
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 |
# File 'app/helpers/application_helper.rb', line 209 def edited_time_ago_with_tooltip(editable_object, placement: 'top', html_class: 'time_ago', exclude_author: false) return unless editable_object.edited? content_tag :div, class: 'edited-text gl-mt-4 gl-text-subtle gl-text-sm' do timeago = time_ago_with_tooltip(editable_object.last_edited_at, placement: placement, html_class: html_class) if ! && editable_object.last_edited_by = link_to_member(editable_object.last_edited_by, avatar: false, extra_class: 'hover:gl-underline gl-text-subtle', author_class: nil) output = safe_format(_("Edited %{timeago} by %{author}"), timeago: timeago, author: ) else output = safe_format(_("Edited %{timeago}"), timeago: timeago) end output end end |
#error_css ⇒ Object
rubocop: enable CodeReuse/ActiveRecord
45 46 47 48 49 50 51 52 53 |
# File 'app/helpers/application_helper.rb', line 45 def error_css Rails.application .assets_manifest .find_sources('errors.css') .first .to_s .force_encoding('UTF-8') # See https://gitlab.com/gitlab-org/gitlab/-/merge_requests/145363 .html_safe # rubocop:disable Rails/OutputSafety -- No escaping needed end |
#external_storage_url_or_path(path, project = @project) ⇒ Object
266 267 268 269 270 271 272 273 274 275 276 277 278 279 |
# File 'app/helpers/application_helper.rb', line 266 def external_storage_url_or_path(path, project = @project) return path if @snippet || !static_objects_external_storage_enabled? uri = URI(Gitlab::CurrentSettings.static_objects_external_storage_url) path = URI(path) # `path` could have query parameters, so we need to split query and path apart query = Rack::Utils.parse_nested_query(path.query) query['token'] = current_user.static_object_token unless project.public? uri.path = path.path uri.query = query.to_query unless query.empty? uri.to_s end |
#extra_config ⇒ Object
shortcut for gitlab extra config
167 168 169 |
# File 'app/helpers/application_helper.rb', line 167 def extra_config Gitlab.config.extra end |
#gitlab_config ⇒ Object
shortcut for gitlab config
162 163 164 |
# File 'app/helpers/application_helper.rb', line 162 def gitlab_config Gitlab.config.gitlab end |
#gitlab_ui_form_for(record, *args, &block) ⇒ Object
492 493 494 495 496 |
# File 'app/helpers/application_helper.rb', line 492 def gitlab_ui_form_for(record, *args, &block) = args. form_for(record, *(args << .merge({ builder: ::Gitlab::FormBuilders::GitlabUiFormBuilder })), &block) end |
#gitlab_ui_form_with(**args, &block) ⇒ Object
498 499 500 |
# File 'app/helpers/application_helper.rb', line 498 def gitlab_ui_form_with(**args, &block) form_with(**args.merge({ builder: ::Gitlab::FormBuilders::GitlabUiFormBuilder }), &block) end |
#hexdigest(string) ⇒ Object
rubocop: enable CodeReuse/ActiveRecord
126 127 128 |
# File 'app/helpers/application_helper.rb', line 126 def hexdigest(string) Digest::SHA1.hexdigest string end |
#hidden_resource_icon(resource, css_class: nil) ⇒ Object
502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 |
# File 'app/helpers/application_helper.rb', line 502 def hidden_resource_icon(resource, css_class: nil) issuable_title = _('This %{issuable} is hidden because its author has been banned.') case resource when Issue title = format(issuable_title, issuable: _('issue')) when MergeRequest title = format(issuable_title, issuable: _('merge request')) when Project title = _('This project is hidden because its creator has been banned') end return unless title content_tag(:span, class: 'has-tooltip', title: title) do sprite_icon('spam', css_class: ['gl-align-text-bottom', css_class].compact_blank.join(' ')) end end |
#instance_review_permitted? ⇒ Boolean
258 259 260 |
# File 'app/helpers/application_helper.rb', line 258 def instance_review_permitted? ::Gitlab::CurrentSettings.instance_review_permitted? && current_user&.can_read_all_resources? end |
#last_commit(project) ⇒ Object
94 95 96 97 98 99 100 101 102 |
# File 'app/helpers/application_helper.rb', line 94 def last_commit(project) if project.repo_exists? time_ago_with_tooltip(project.repository.commit.committed_date) else 'Never' end rescue StandardError 'Never' end |
#linkedin_name(user) ⇒ Object
357 358 359 |
# File 'app/helpers/application_helper.rb', line 357 def linkedin_name(user) user.linkedin.chomp('/').gsub(%r{.*/}, '') end |
#linkedin_url(user) ⇒ Object
361 362 363 364 |
# File 'app/helpers/application_helper.rb', line 361 def linkedin_url(user) name = linkedin_name(user) "https://www.linkedin.com/in/#{name}" end |
#locale_path ⇒ Object
405 406 407 |
# File 'app/helpers/application_helper.rb', line 405 def locale_path asset_path("locale/#{Gitlab::I18n.locale}/app.js") end |
#mastodon_url(user) ⇒ Object
387 388 389 390 391 392 393 394 395 396 397 |
# File 'app/helpers/application_helper.rb', line 387 def mastodon_url(user) return '' if user.mastodon.blank? url = user.mastodon.match UserDetail::MASTODON_VALIDATION_REGEX if url && Feature.enabled?(:verify_mastodon_user, user) external_redirect_path(url: "https://#{url[2]}/@#{url[1]}", rel: 'me') else external_redirect_path(url: "https://#{url[2]}/@#{url[1]}") end end |
#outdated_browser? ⇒ Boolean
299 300 301 |
# File 'app/helpers/application_helper.rb', line 299 def outdated_browser? browser.ie? end |
#page_class ⇒ Object
322 323 324 325 326 327 328 329 330 331 |
# File 'app/helpers/application_helper.rb', line 322 def page_class class_names = ['with-top-bar'] class_names << 'issue-boards-page gl-overflow-auto' if current_controller?(:boards) class_names << 'epic-boards-page gl-overflow-auto' if current_controller?(:epic_boards) class_names << 'with-performance-bar' if class_names << 'with-header' if @with_header || !current_user class_names << class_names end |
#page_filter_path(options = {}) ⇒ Object
281 282 283 284 285 286 287 288 289 290 291 292 293 |
# File 'app/helpers/application_helper.rb', line 281 def page_filter_path( = {}) without = .delete(:without) = request.query_parameters.merge() if without.present? without.each do |key| .delete(key) end end "#{request.path}?#{.compact.to_param}" end |
#page_startup_api_calls ⇒ Object
447 448 449 |
# File 'app/helpers/application_helper.rb', line 447 def page_startup_api_calls @api_startup_calls end |
#partial_exists?(partial) ⇒ Boolean
36 37 38 |
# File 'app/helpers/application_helper.rb', line 36 def partial_exists?(partial) lookup_context.exists?(partial, [], true) end |
#path_to_key(key, admin = false) ⇒ Object
303 304 305 306 307 308 309 |
# File 'app/helpers/application_helper.rb', line 303 def path_to_key(key, admin = false) if admin admin_user_key_path(@user, key) else user_settings_ssh_key_path(key) end end |
#project_data ⇒ Object
144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'app/helpers/application_helper.rb', line 144 def project_data return {} unless @project { project_id: @project.id, project: @project.path, project_full_path: @project.full_path, group: @project.group&.path, group_full_path: @project.group&.full_path, namespace_id: @project.namespace&.id } end |
#promo_host ⇒ Object
Convenient method for Rails helper
232 233 234 |
# File 'app/helpers/application_helper.rb', line 232 def promo_host ApplicationHelper.promo_host end |
#promo_url ⇒ Object
250 251 252 |
# File 'app/helpers/application_helper.rb', line 250 def promo_url ApplicationHelper.promo_url end |
#read_only_message ⇒ Object
Overridden in EE
410 411 412 413 414 |
# File 'app/helpers/application_helper.rb', line 410 def return unless Gitlab::Database.read_only? _('You are on a read-only GitLab instance.') end |
#registry_config ⇒ Object
shortcut for gitlab registry config
172 173 174 |
# File 'app/helpers/application_helper.rb', line 172 def registry_config Gitlab.config.registry end |
#render_if_exists(partial = nil, **options) ⇒ Object
See docs.gitlab.com/ee/development/ee_features.html#code-in-appviews rubocop: disable CodeReuse/ActiveRecord We allow partial to be nil so that collection views can be passed in ‘render partial: ’some/view’, collection: @some_collection`
12 13 14 15 16 17 18 19 20 |
# File 'app/helpers/application_helper.rb', line 12 def render_if_exists(partial = nil, **) return unless partial_exists?(partial || [:partial]) if partial.nil? render(**) else render(partial, ) end end |
#show_callout?(name) ⇒ Boolean
353 354 355 |
# File 'app/helpers/application_helper.rb', line 353 def show_callout?(name) [name] != 'true' end |
#show_last_push_widget?(event) ⇒ Boolean
Define whenever show last push event with suggestion to create MR rubocop: disable CodeReuse/ActiveRecord
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
# File 'app/helpers/application_helper.rb', line 107 def (event) # Skip if event is not about added or modified non-master branch return false unless event && event.last_push_to_non_root? && !event.rm_ref? project = event.project # Skip if project repo is empty or MR disabled return false unless project && !project.empty_repo? && project.feature_available?(:merge_requests, current_user) # Skip if user already created appropriate MR return false if project.merge_requests.where(source_branch: event.branch_name).opened.any? # Skip if user removed branch right after that return false unless project.repository.branch_exists?(event.branch_name) true end |
#sign_in_with_redirect? ⇒ Boolean
295 296 297 |
# File 'app/helpers/application_helper.rb', line 295 def sign_in_with_redirect? current_page?(new_user_session_path) && session[:user_return_to].present? end |
#simple_sanitize(str) ⇒ Object
130 131 132 |
# File 'app/helpers/application_helper.rb', line 130 def simple_sanitize(str) sanitize(str, tags: %w[a span]) end |
#static_objects_external_storage_enabled? ⇒ Boolean
262 263 264 |
# File 'app/helpers/application_helper.rb', line 262 def static_objects_external_storage_enabled? Gitlab::CurrentSettings.static_objects_external_storage_enabled? end |
#support_url ⇒ Object
254 255 256 |
# File 'app/helpers/application_helper.rb', line 254 def support_url Gitlab::CurrentSettings.current_application_settings.help_page_support_url.presence || "#{promo_url}/get-help/" end |
#system_message_class ⇒ Object
333 334 335 336 337 338 339 340 341 342 |
# File 'app/helpers/application_helper.rb', line 333 def class_names = [] return class_names unless appearance class_names << 'with-system-header' if appearance.show_header? class_names << 'with-system-footer' if appearance. class_names.join(' ') end |
#template_exists?(template) ⇒ Boolean
40 41 42 |
# File 'app/helpers/application_helper.rb', line 40 def template_exists?(template) lookup_context.exists?(template, [], false) end |
#time_ago_with_tooltip(time, placement: 'top', html_class: '', short_format: false) ⇒ Object
Render a ‘time` element with Javascript-based relative date and tooltip
time - Time object placement - Tooltip placement String (default: “top”) html_class - Custom class for ‘time` element (default: “time_ago”)
By default also includes a ‘script` element with Javascript necessary to initialize the `timeago` jQuery extension. If this method is called many times, for example rendering hundreds of commits, it’s advisable to disable this behavior using the ‘skip_js` argument and re-initializing `timeago` manually once all of the elements have been rendered.
A ‘js-timeago` class is always added to the element, even when a custom `html_class` argument is provided.
Returns an HTML-safe String
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 |
# File 'app/helpers/application_helper.rb', line 192 def time_ago_with_tooltip(time, placement: 'top', html_class: '', short_format: false) return "" if time.nil? css_classes = [short_format ? 'js-short-timeago' : 'js-timeago'] css_classes << html_class unless html_class.blank? content_tag :time, l(time, format: "%b %d, %Y"), class: css_classes.join(' '), title: l(time.to_time.in_time_zone, format: :timeago_tooltip), datetime: time.to_time.getutc.iso8601, data: { toggle: 'tooltip', placement: placement, container: 'body' } end |
#twitter_url(user) ⇒ Object
366 367 368 369 370 371 372 373 |
# File 'app/helpers/application_helper.rb', line 366 def twitter_url(user) name = user.twitter if %r{\Ahttps?://(www\.)?twitter\.com/}.match?(name) name else "https://twitter.com/#{name}" end end |