Reputation: 10400
I need to design a form for a account
resource. In that form, i need to collect some set of ids as an array in the params
hash in attribute called relationships
.
So the final params[account]
hash from the POST request should be like:
{:name => 'somename', :relationships => ["123", "23", "23445"]}
How shall I design the form_for
fields? I tried this, but didn't work:
<%= form_for @account do |f| %>
<%= f.text_field :name %>
<% @eligible_parents.each do |p| %>
<%= f.check_box "relationships", nil, :value => p.id %>
<b><%= p.name %></b><br/>
</span>
<% end %>
<%= f.submit "Submit" %>
<% end %>
Number of elements in @eligible_parents
varies every time.
relationships
is neither an association nor an attribute in account
model.
I have to use virtual attributes but I need to fill in an array from a form.
Please help. How can I do this?
Upvotes: 7
Views: 13200
Reputation: 41
I'm working in something similar. My issue was how to pass the input name to a partial to resolve it as a hash using the rails form_for
helper.
So, my solutions was something like this:
= render 'my_partial', form: form, name: "item_ids[item.id]"
So, this gonna render an html like this:
<input class="form-control" name="products[items_ids[1]]" id="products_items_ids[1]">
The number 1
is the item.id
, this is how HTML understand that you gonna pass an array or hash, all depends your config.
So, the params gonna look like this:
"items_ids"=>{"1"=>"1"}
This is working for me with an form_object + virtus
Upvotes: 0
Reputation: 6728
If you want to send array of values just use [] in name attributes.In your case just use
<%= f.check_box "relationships", {}, :value => p.id, :name => "relationships[]" %>
Upvotes: 3
Reputation: 838
I found this to be the cleanest way...
If you are working with straight data and want to send back an array without using any of these @objects:
<%= form_for :team do |t| %>
<%= t.fields_for 'people[]', [] do |p| %>
First Name: <%= p.text_field :first_name %>
Last Name: <%= p.text_field :last_name %>
<% end %>
<% end %>
your params data should return like this:
"team" => {
"people" => [
{"first_name" => "Michael", "last_name" => "Jordan"},
{"first_name" => "Steve", "last_name" => "Jobs"},
{"first_name" => "Barack", "last_name" => "Obama"}
]
}
Upvotes: 2
Reputation: 4383
You still need a fields_for
in your view, just use :relationships
as the record_name
then provide an object.
<%= form_for @account do |f| %>
<%= f.text_field :name %>
<% fields_for :relationships, @eligible_parents do |p| %>
<%= p.check_box "relationships", nil, :value => p.object.id %>
<b><%= p.object.name %></b><br/>
<% end %>
<%= f.submit "Submit" %>
<% end %>
Documentation here: ActionView::Helpers::FormHelper
Upvotes: 6