aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/lib/action_view/helpers
Commit message (Collapse)AuthorAgeFilesLines
* Merge pull request #33564 from avit/escape_javascript_castingRafael França2018-09-211-4/+5
|\ | | | | Let escape_javascript handle conversion to string
| * Let escape_javascript handle conversion to stringAndrew Vit2018-09-211-4/+5
| | | | | | | | | | | | | | | | | | | | | | | | This brings `escape_javascript` in line with the behavior of `json_escape` and allows other value types to be output without needing explicit casting in the view template. Example: <%= javascript_tag do %> var locale = '<%== j I18n.locale %>'; // locale is a symbol <% end %>
* | Move digest path calculation out of loopschneems2018-09-111-9/+17
| | | | | | | | | | | | | | | | | | | | | | On every iteration of generating a cache for a collection a “digest path” is calculated even though it’s exactly the same for every element. This PR exposes a method `digest_path_from_virtual` that returns back a “digest_path”. This can in turn be passed back into `cache_fragment_name`. This not only does less work, but it also (you guessed it) uses less memory. before: Total allocated: 762539 bytes (7035 objects) after: Total allocated: 743590 bytes (6621 objects) (762539 - 743590)/ 762539.0 # => 2.4% faster ⚡️⚡️
* | [ci skip] Doc ActionView::OutputBufferschneems2018-09-061-3/+2
| |
* | [ci skip] Clarify CaptureHelper#capture functionschneems2018-09-061-0/+5
| |
* | Merge pull request #33718 from kddeisz/permit-listMatthew Draper2018-08-291-2/+2
|\ \ | | | | | | Finish converting whitelist and blacklist references
| * | Permit list usage cleanup and clearer documentationKevin Deisz2018-08-271-1/+1
| | |
| * | Convert over the rest of the whitelist referencesKevin Deisz2018-08-241-2/+2
| | |
* | | Add `:namespace` option to the api docs of `form_with` [ci skip]bogdanvlviv2018-08-271-0/+3
|/ /
* | Merge pull request #33547 from Ana06/patch-1Matthew Draper2018-08-231-2/+10
|\ \ | | | | | | | | | Use public_send in value_for_collection
| * | Deprecate use of private methods in view's helpersAna María Martínez Gómez2018-08-081-2/+12
| | | | | | | | | | | | | | | Instead of dropping it completely in case someone is relying (probably inadvertenly) on it.
| * | Use public_send in extract_values_from_collectionAna María Martínez Gómez2018-08-081-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | Avoid exposing private methods in view's helpers. However, as `extract_values_from_collection` is only called from `options_from_collection_for_select` where `value_for_collection` is previously called, this case was already covered. The change makes anyway sense for consistency and in case the code changes in the future.
| * | Use public_send in value_for_collectionAna María Martínez Gómez2018-08-071-1/+1
| |/ | | | | | | | | | | Avoid exposing private methods in view's helpers. Fixes https://github.com/rails/rails/issues/33546
* | Merge pull request #31132 from ↵Ryuta Kamizono2018-08-201-0/+5
|\ \ | | | | | | | | | | | | | | | | | | emaxi/feature/add-missing-documentation-option-to-number-to-currency Add missing documentation option to number_to_currency [ci skip]
| * | Add missing documentation options to number_to_currency [ci skip]emaxi2018-07-111-0/+5
| | |
* | | Enable Style/ParenthesesAroundCondition copRyuta Kamizono2018-08-191-1/+1
| | | | | | | | | | | | To prevent style check in review like https://github.com/rails/rails/pull/33608#discussion_r211087605.
* | | Fix unclosed tags [ci skip]yuuji.yaginuma2018-08-181-1/+1
| |/ |/|
* | [ci skip] Change references from Rake task to Rails commandAlberto Almagro2018-08-011-2/+3
| | | | | | | | | | This commit follows the path we started at commit #ea4f0e2 and continued at PR #33229.
* | Enable Start/EndWith and RegexpMatch copsBart de Water2018-07-282-2/+2
| | | | | | | | | | In cases where the MatchData object is not used, this provides a speed-up: https://github.com/JuanitoFatas/fast-ruby/#stringmatch-vs-stringmatch-vs-stringstart_withstringend_with-code-start-code-end
* | Merge pull request #33268 from benpickles/remove-pubdate-from-docsRichard Schneeman2018-07-211-2/+0
|\ \ | | | | | | Keep time_tag docs up-to-date.
| * | Keep time_tag docs up-to-date.Ben Pickles2018-07-011-2/+0
| | | | | | | | | | | | | | | The pubdate attribute was removed from the spec, see 940eec417f20e53abd3e3114c7fa845dac0d3a62 for context.
* | | Fix leaking special form_with attributes into html attributesYurii Cherniavskyi2018-07-203-7/+8
| | | | | | | | | | | | | | | Special form_with attributes `skip_default_ids` and `allow_method_names_outside_object` attributes are leaking into html attributes of option select tag helpers.
* | | Fix issue with `button_to`'s `to_form_params`Georgi Georgiev2018-07-161-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | `button_to` was throwing exception when invoked with `params` hash that contains symbol and string keys. The reason for the exception was that `to_form_params` was comparing the given symbol and string keys. The issue is fixed by turning all keys to strings inside `to_form_params` before comparing them.
* | | [ci skip] `sanitizer_vendor` will be removed in Rails 6Tsukuru Tanimichi2018-07-111-1/+1
| | | | | | | | | Related to https://github.com/rails/rails/pull/24386#issuecomment-403926683
* | | Merge pull request #32361 from ph3t/safe-html-translation-arraysKasper Timm Hansen2018-07-031-2/+5
|\ \ \ | |/ / |/| | Add safe html support to arrays of translations
| * | Add safe html support to arrays of translationsJuan Broullon2018-07-031-2/+5
| | |
* | | Add to docs mention about `:year_format` option of date selectbogdanvlviv2018-06-221-0/+4
| | | | | | | | | | | | | | | | | | Follow up #32190 [ci skip]
* | | Add `year_format` option to date_select tag. This option makes it possible ↵Koki Ryu2018-06-101-1/+44
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | to customize year names. Lambda should be passed to use this option. Example: date_select('user_birthday', '', start_year: 1998, end_year: 2000, year_format: ->year { "Heisei #{year - 1988}" }) The HTML produced: <select id="user_birthday__1i" name="user_birthday[(1i)]"> <option value="1998">Heisei 10</option> <option value="1999">Heisei 11</option> <option value="2000">Heisei 12</option> </select> /* The rest is omitted */
* | | Fix RDoc formatting: `+` doesn't work with space [ci skip]yuuji.yaginuma2018-05-231-1/+1
| | | | | | | | | | | | Follow up of #32958.
* | | Indicate `true` in a doc comment is code-like.Corey Farwell2018-05-221-1/+1
| | |
* | | Remove reference to old `:text` rendering optionTyler Hunt2018-05-111-1/+0
| | | | | | | | | | | | [ci skip]
* | | Don't allocate unnecessary array in translation helperMax Melentiev2018-04-281-8/+2
| | |
* | | Address `Style/StringLiterals` offenceRyuta Kamizono2018-04-271-1/+1
| | | | | | | | | | | | Caused at 9276ea89d2b0be9fdd1ad6590857f8d45a38c267.
* | | Don't try to destoy the given string via method argumentAkira Matsuda2018-04-271-1/+1
| | | | | | | | | | | | | | | | | | | | | Or it would raise if the argument was frozen. And even with this change, it would still reduce String allocations together with 9276ea89d2b0be9fdd1ad6590857f8d45a38c267 because `escape` should be `true` in most cases
* | | Reduce String allocations when building Action View tagsAkira Matsuda2018-04-271-1/+2
| | | | | | | | | | | | | | | This method is called against each tag option for each tag, and creates an extra garbage String per each call
* | | Merge pull request #32471 from janko-m/use-image_processing-gemGeorge Claghorn2018-04-231-2/+2
|\ \ \ | | | | | | | | Use ImageProcessing gem for ActiveStorage variants
| * | | Recommend using :resize_to_fit after allJanko Marohnić2018-04-231-2/+2
| | | |
* | | | Merge pull request #32607 from yaroslav/feature/nonce-for-javascript_include_tagAndrew White2018-04-181-0/+8
|\ \ \ \ | | | | | | | | | | Add the `nonce: true` option for `javascript_include_tag` helper.
| * | | | Add the `nonce: true` option for `javascript_include_tag` helper.Yaroslav Markin2018-04-171-0/+8
| | | | |
* | | | | Merge pull request #32326 from ↵Guillermo Iguaran2018-04-181-1/+5
|\ \ \ \ \ | |/ / / / |/| | | | | | | | | | | | | | q-centrix/perf-improvement-translation-helper-default-array Only create an array with default options if we have default options
| * | | | Only create an array with default options if we have default optionsDillon Welch2018-03-221-1/+5
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the options passed in don't have a default key, there's no point in creating an array from those empty results when we can just go straight to creating an empty array. Benchmarks: ```ruby master_version with false {:FREE=>-2497, :T_STRING=>52, :T_ARRAY=>2000, :T_HASH=>1000, :T_IMEMO=>1} master_version with true {:FREE=>-3001, :T_ARRAY=>2000, :T_HASH=>1000} fast_version with false {:FREE=>-1001, :T_ARRAY=>1000} fast_version with true {:FREE=>-3001, :T_ARRAY=>2000, :T_HASH=>1000} Warming up -------------------------------------- master_version with false 104.985k i/100ms master_version with true 118.737k i/100ms fast_version with false 206.013k i/100ms fast_version with true 107.005k i/100ms Calculating ------------------------------------- master_version with false 1.970M (±24.6%) i/s - 8.924M in 5.010302s master_version with true 2.152M (±12.4%) i/s - 10.686M in 5.051588s fast_version with false 5.613M (±19.6%) i/s - 26.782M in 5.003740s fast_version with true 2.027M (±15.8%) i/s - 9.951M in 5.065670s Comparison: fast_version with false: 5613159.2 i/s master_version with true: 2152354.4 i/s - 2.61x slower fast_version with true: 2027296.0 i/s - 2.77x slower master_version with false: 1969824.9 i/s - 2.85x slower ``` Benchmark code: ```ruby begin require "bundler/inline" rescue LoadError => e $stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" raise e end gemfile(true) do source "https://rubygems.org" gem "benchmark-ips" gem "rails" end def allocate_count GC.disable before = ObjectSpace.count_objects yield after = ObjectSpace.count_objects after.each { |k,v| after[k] = v - before[k] } after[:T_HASH] -= 1 # probe effect - we created the before hash. GC.enable result = after.reject { |k,v| v == 0 } GC.start result end def master_version(key) Array({}.delete(:default)).compact end def fast_version(key) if key Array({}.delete(:default)).compact else [] end end def test puts "master_version with false" puts allocate_count { 1000.times { master_version(false) } } puts "master_version with true" puts allocate_count { 1000.times { master_version(true) } } puts "fast_version with false" puts allocate_count { 1000.times { fast_version(false) } } puts "fast_version with true" puts allocate_count { 1000.times { fast_version(true) } } Benchmark.ips do |x| x.report("master_version with false") { master_version(false) } x.report("master_version with true") { master_version(true) } x.report("fast_version with false") { fast_version(false) } x.report("fast_version with true") { fast_version(true) } x.compare! end end test ```
* | | | | Inclusive Language in Documentation Examples [ci skip]Cassidy Kobewka2018-04-151-2/+2
| |/ / / |/| | |
* | | | Remove RecordTagHelperYoshiyuki Hirano2018-04-071-23/+0
| | | | | | | | | | | | | | | | | | | | | | | | | | | | * Since #18411, we started to inform about extracted gem (record_tag_helper) to developers who use `ActionView::Helpers::RecordTagHelper` 's methods. * Currently, it seems no problem that we don't have to support no longer.
* | | | Remove redundant type checkAndrew White2018-04-061-2/+1
| | | | | | | | | | | | | | | | All of Date, DateTime and Time respond to `iso8601`.
* | | | passing splat keyword arguments as a single Hashutilum2018-04-041-1/+1
| | | | | | | | | | | | | | | | Ruby 2.6.0 warns about this.
* | | | Small doc fixesT.J. Schuck2018-04-021-1/+1
| | | | | | | | | | | | | | | | [ci skip]
* | | | Use consistent spacing in actionview helper docs [ci skip]Olivier Lacan2018-04-014-23/+23
| |/ / |/| | | | | | | | | | | | | | | | | | | | The spacing in these comments is fairly inconsistent. Array argument contents are often separated with a space from the array literal brackets but in several cases the Hash literal curly braces are tangent to their contents which makes the documentation harder to read in some cases.
* | | Merge pull request #32305 from q-centrix/perf-improvement-translation-helperAndrew White2018-03-201-2/+5
|\ \ \ | | | | | | | | Memoize the result of gsubbing @virtual_path
| * | | Memoize the result of gsubbing @virtual_pathDillon Welch2018-03-201-2/+5
| |/ / | | | | | | | | | | | | | | | This gets called many times for each virtual_path, creating a new string each time that `translate` is called. We can memoize this so that it only happens once per virtual_path instead.
* / / Interpolate '' instead of nil when multiple is false.Dillon Welch2018-03-201-3/+3
|/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | "my string #{nil}" results in an additional '' string allocation, I'm guessing because the nil has to be converted to a string. "my string #{'[]' if multiple}" results in "my string #{nil}" if multiple is false. Doing "my string #{''}" does not result in an extra string allocation. I moved the if multiple logic into a method so I only had to make the change once. ```ruby begin require "bundler/inline" rescue LoadError => e $stderr.puts "Bundler version 1.10 or later is required. Please update your Bundler" raise e end gemfile(true) do source "https://rubygems.org" gem "benchmark-ips" gem "rails" end def allocate_count GC.disable before = ObjectSpace.count_objects yield after = ObjectSpace.count_objects after.each { |k,v| after[k] = v - before[k] } after[:T_HASH] -= 1 # probe effect - we created the before hash. GC.enable result = after.reject { |k,v| v == 0 } GC.start result end @html_options = {} def master_version(multiple=nil) "hi#{"[]" if multiple}" end def fast_version(multiple=nil) str = multiple ? "[]" : '' "hi#{str}" end def test puts "master_version" puts allocate_count { 1000.times { master_version } } puts "master_version with arg" puts allocate_count { 1000.times { master_version(' there') } } puts "fast_version" puts allocate_count { 1000.times { fast_version } } puts "fast_version with arg" puts allocate_count { 1000.times { fast_version(' there') } } Benchmark.ips do |x| x.report("master_version") { master_version } x.report("master_version with arg") { master_version(' there') } x.report("fast_version") { fast_version } x.report("fast_version with arg") { fast_version(' there') } x.compare! end end test ``` results: ```ruby master_version {:FREE=>-1981, :T_STRING=>2052} master_version with arg {:FREE=>-1001, :T_STRING=>1000} fast_version {:FREE=>-1001, :T_STRING=>1000} fast_version with arg {:FREE=>-1001, :T_STRING=>1000} Warming up -------------------------------------- master_version 138.851k i/100ms master_version with arg 164.029k i/100ms fast_version 165.737k i/100ms fast_version with arg 167.016k i/100ms Calculating ------------------------------------- master_version 2.464M (±14.7%) i/s - 11.941M in 5.023307s master_version with arg 3.754M (± 8.5%) i/s - 18.699M in 5.021354s fast_version 3.449M (±11.7%) i/s - 17.071M in 5.033312s fast_version with arg 3.636M (± 6.9%) i/s - 18.205M in 5.034792s Comparison: master_version with arg: 3753896.1 i/s fast_version with arg: 3636094.5 i/s - same-ish: difference falls within error fast_version: 3448766.2 i/s - same-ish: difference falls within error master_version: 2463857.3 i/s - 1.52x slower ```