Skip to content

Commit 7492861

Browse files
pvmeerbemattbrictson
authored andcommitted
Don't rely on Class#name for model naming (bootstrap-ruby#285)
* Don't rely on Class#name for model naming taken from bootstrap-ruby#217 (@boffbowsh) Relying on Class#name for model naming breaks compatibility with anonymous models. The ActiveModel::Naming#model_name method is preferred Also, don’t attempt to get help text for nil objects. This was previously attempting to lookup activerecord.help.nil_class.field_name or similar. * Update CHANGELOG.md
1 parent 6098497 commit 7492861

File tree

3 files changed

+47
-8
lines changed

3 files changed

+47
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
## [Pending Release][]
22

33
Bugfixes:
4+
- Fix getting help text for elements when using anonymous models (see [issue 282](https://github.com/bootstrap-ruby/rails-bootstrap-forms/issues/282))
45
- Your contribution here!
56

67
Features:

lib/bootstrap_form/form_builder.rb

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -425,15 +425,21 @@ def inputs_collection(name, collection, value, text, options = {}, &block)
425425
end
426426

427427
def get_help_text_by_i18n_key(name)
428-
underscored_scope = "activerecord.help.#{object.class.name.underscore}"
429-
downcased_scope = "activerecord.help.#{object.class.name.downcase}"
430-
help_text = I18n.t(name, scope: underscored_scope, default: '').presence
431-
help_text ||= if text = I18n.t(name, scope: downcased_scope, default: '').presence
432-
warn "I18n key '#{downcased_scope}.#{name}' is deprecated, use '#{underscored_scope}.#{name}' instead"
433-
text
434-
end
428+
if object
429+
430+
# ActiveModel::Naming 3.X.X does not support .name; it is supported as of 4.X.X
431+
partial_scope = object.class.model_name.respond_to?(:name) ? object.class.model_name.name : object.class.model_name
435432

436-
help_text
433+
underscored_scope = "activerecord.help.#{partial_scope.underscore}"
434+
downcased_scope = "activerecord.help.#{partial_scope.downcase}"
435+
help_text = I18n.t(name, scope: underscored_scope, default: '').presence
436+
help_text ||= if text = I18n.t(name, scope: downcased_scope, default: '').presence
437+
warn "I18n key '#{downcased_scope}.#{name}' is deprecated, use '#{underscored_scope}.#{name}' instead"
438+
text
439+
end
440+
help_text
441+
end
437442
end
443+
438444
end
439445
end
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
require 'test_helper'
2+
3+
class SpecialFormClassModelsTest < ActionView::TestCase
4+
include BootstrapForm::Helper
5+
6+
test "Anonymous models are supported for form builder" do
7+
user_klass = Class.new(User)
8+
def user_klass.model_name
9+
ActiveModel::Name.new(User)
10+
end
11+
12+
@user = user_klass.new(email: '[email protected]', password: 'secret', comments: 'my comment')
13+
@builder = BootstrapForm::FormBuilder.new(:user, @user, self, {})
14+
@horizontal_builder = BootstrapForm::FormBuilder.new(:user, @user, self, {layout: :horizontal, label_col: "col-sm-2", control_col: "col-sm-10"})
15+
I18n.backend.store_translations(:en, {activerecord: {help: {user: {password: "A good password should be at least six characters long"}}}})
16+
17+
expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="date" /></div>}
18+
assert_equal expected, @builder.date_field(:misc)
19+
end
20+
21+
22+
test "Nil models are supported for form builder" do
23+
@user = nil
24+
@builder = BootstrapForm::FormBuilder.new(:user, @user, self, {})
25+
@horizontal_builder = BootstrapForm::FormBuilder.new(:user, @user, self, {layout: :horizontal, label_col: "col-sm-2", control_col: "col-sm-10"})
26+
I18n.backend.store_translations(:en, {activerecord: {help: {user: {password: "A good password should be at least six characters long"}}}})
27+
28+
expected = %{<div class="form-group"><label class="control-label" for="user_misc">Misc</label><input class="form-control" id="user_misc" name="user[misc]" type="date" /></div>}
29+
assert_equal expected, @builder.date_field(:misc)
30+
end
31+
32+
end

0 commit comments

Comments
 (0)