Skip to content

Commit

Permalink
Add ability to explicitly set a key (#5)
Browse files Browse the repository at this point in the history
form_props autocamelizes keys, but sometimes we'd like to be explicit. This adds
the option to set the key and skip camelize.
  • Loading branch information
jho406 committed Dec 22, 2023
1 parent 0d715be commit ab0b91b
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 4 deletions.
4 changes: 3 additions & 1 deletion lib/form_props/inputs/base.rb
Expand Up @@ -11,13 +11,15 @@ def initialize(object_name, method_name, template_object, options = {})
options = options.with_indifferent_access

@controlled = options.delete(:controlled)
@key = options.delete(:key)

super(object_name, method_name, template_object, options)
end

private

def sanitized_key
sanitized_method_name.camelize(:lower)
@key || sanitized_method_name.camelize(:lower)
end

def add_options(option_tags, options, value = nil)
Expand Down
8 changes: 5 additions & 3 deletions lib/form_props/inputs/radio_button.rb
Expand Up @@ -22,8 +22,6 @@ def render(flatten = false)
@options[:value] = @tag_value
@options[:checked] = true if input_checked?(@options)

name_for_key = (sanitized_method_name + "_#{sanitized_value(@tag_value)}").camelize(:lower)

body_block = -> {
add_default_name_and_id_for_value(@tag_value, @options)
input_props(@options)
Expand All @@ -32,14 +30,18 @@ def render(flatten = false)
if flatten
body_block.call
else
json.set!(name_for_key) do
json.set!(sanitized_key) do
body_block.call
end
end
end

private

def sanitized_key
@key || (sanitized_method_name + "_#{sanitized_value(@tag_value)}").camelize(:lower)
end

def checked?(value)
value.to_s == @tag_value.to_s
end
Expand Down
69 changes: 69 additions & 0 deletions test/form_props_test.rb
Expand Up @@ -364,6 +364,75 @@ def test_form_with_using_controlled_option
assert_equal(result, expected)
end

def test_form_with_explicit_key
form_props(model: @post, id: "create-post") do |f|
f.text_field(:title, key: :aTitle)
f.text_area(:body, key: :aBody)
f.check_box(:secret, key: :aSecret)
f.select(:category, %w[animal economy sports], key: :aCategory)
end

result = json.result!.strip

expected = {
inputs: {
aTitle: {
type: "text",
defaultValue: "Hello World",
name: "post[title]",
id: "post_title"
},
aBody: {
name: "post[body]",
id: "post_body",
type: "textarea",
defaultValue: "Back to the hill and over it again!"
},
aSecret: {
type: "checkbox",
defaultValue: "1",
defaultChecked: true,
uncheckedValue: "0",
includeHidden: true,
name: "post[secret]",
id: "post_secret"
},
aCategory: {
name: "post[category]",
id: "post_category",
type: "select",
options: [
{value: "animal", label: "animal"},
{value: "economy", label: "economy"},
{value: "sports", label: "sports"}
]
}
},
extras: {
method: {
name: "_method",
type: "hidden",
defaultValue: "patch",
autoComplete: "off"
},
utf8: {
name: "utf8",
type: "hidden",
defaultValue: "\u0026#x2713;",
autoComplete: "off"
}
},
props: {
id: "create-post",
action: "/posts/123",
acceptCharset: "UTF-8",
method: "post"
}
}.to_json
assert_equal(result, expected)
end


def with_default_enforce_utf8(value)
old_value = ActionView::Helpers::FormTagHelper.default_enforce_utf8
ActionView::Helpers::FormTagHelper.default_enforce_utf8 = value
Expand Down

0 comments on commit ab0b91b

Please sign in to comment.