Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Defaults passed to simple_form_for should propagate to input_field #713

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/simple_form/form_builder.rb
Expand Up @@ -134,6 +134,8 @@ def input(attribute_name, options={}, &block)
def input_field(attribute_name, options={})
options = options.dup
options[:input_html] = options.except(:as, :collection, :label_method, :value_method)
options = @defaults.deep_dup.deep_merge(options) if @defaults

SimpleForm::Wrappers::Root.new([:input], :wrapper => false).render find_input(attribute_name, options)
end

Expand Down
66 changes: 41 additions & 25 deletions test/form_builder/general_test.rb
Expand Up @@ -306,49 +306,65 @@ def with_custom_form_for(object, *args, &block)
end

# DEFAULT OPTIONS
test 'builder should receive a default argument and pass it to the inputs' do
with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class' } } do |f|
f.input :name
[:input, :input_field].each do |method|
test "builder should receive a default argument and pass it to the inputs when calling '#{method}'" do
with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class' } } do |f|
f.send(method, :name)
end
assert_select 'input.default_class'
end

test "builder should receive a default argument and pass it to the inputs without changing the defaults when calling '#{method}'" do
with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class', :id => 'default_id' } } do |f|
concat(f.send(method, :name))
concat(f.send(method, :credit_limit))
end

assert_select "input.string.default_class[name='user[name]']"
assert_no_select "input.string[name='user[credit_limit]']"
end

test "builder should receive a default argument and pass it to the inputs and nested form when calling '#{method}'" do
@user.company = Company.new(1, 'Empresa')

with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class' } } do |f|
concat(f.send(method, :name))
concat(f.simple_fields_for(:company) do |company_form|
concat(company_form.send(method, :name))
end)
end

assert_select "input.string.default_class[name='user[name]']"
assert_select "input.string.default_class[name='user[company_attributes][name]']"
end
assert_select 'input.default_class'
end

test 'builder should receive a default argument and pass it to the inputs, respecting the specific options' do
test "builder should receive a default argument and pass it to the inputs when calling 'input', respecting the specific options" do
with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class' } } do |f|
f.input :name, :input_html => { :id => 'specific_id' }
end
assert_select 'input.default_class#specific_id'
end

test 'builder should receive a default argument and pass it to the inputs, overwriting the defaults with specific options' do
with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class', :id => 'default_id' } } do |f|
f.input :name, :input_html => { :id => 'specific_id' }
test "builder should receive a default argument and pass it to the inputs when calling 'input_field', respecting the specific options" do
with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class' } } do |f|
f.input_field :name, :id => 'specific_id'
end
assert_select 'input.default_class#specific_id'
end

test 'builder should receive a default argument and pass it to the inputs without changing the defaults' do
test "builder should receive a default argument and pass it to the inputs when calling 'input', overwriting the defaults with specific options" do
with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class', :id => 'default_id' } } do |f|
concat(f.input :name)
concat(f.input :credit_limit)
f.input :name, :input_html => { :id => 'specific_id' }
end

assert_select "input.string.default_class[name='user[name]']"
assert_no_select "input.string[name='user[credit_limit]']"
assert_select 'input.default_class#specific_id'
end

test 'builder should receive a default argument and pass it to the inputs and nested form' do
@user.company = Company.new(1, 'Empresa')

with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class' } } do |f|
concat(f.input :name)
concat(f.simple_fields_for(:company) do |company_form|
concat(company_form.input :name)
end)
test "builder should receive a default argument and pass it to the inputs when calling 'input_field', overwriting the defaults with specific options" do
with_concat_form_for @user, :defaults => { :input_html => { :class => 'default_class', :id => 'default_id' } } do |f|
f.input_field :name, :id => 'specific_id'
end

assert_select "input.string.default_class[name='user[name]']"
assert_select "input.string.default_class[name='user[company_attributes][name]']"
assert_select 'input.default_class#specific_id'
end

# WITHOUT OBJECT
Expand Down