Anand
Anand

Reputation: 10400

Get an array from a Rails form

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

Answers (4)

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

Soundar Rathinasamy
Soundar Rathinasamy

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

Richard Kuo
Richard Kuo

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

Azolo
Azolo

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

Related Questions