Amund
Amund

Reputation: 41

Rails: Flatten array in parameter

I'm trying to flatten an array for my form.

def update
  @tour = Tour.find(params[:id])
  params[:tour][:hotel_ids][0] = params[:tour][:hotel_ids][0].split(',')
...

This results in:

"hotel_ids"=>[["1","2"]]

Naturally I want it to be

"hotel_ids"=>["1","2"]

My Form:

<%= text_field_tag 'tour[hotel_ids][]', nil %>

Hope anyone can help with this.

EDIT


I've gotten it to work, somehow. This might be a bad way to do it though:

I changed the text_field that get's the array from jquery to:

<%= text_field_tag 'tour[h_ids][]', nil %>

then in my controller I did:

params[:tour][:hotel_ids] = params[:tour][:h_ids][0].split(',')

And this works, I had to add h_ids to attr_accessor though. And it will probably be a big WTF for anyone reading the coder later... but is this acceptable?

Upvotes: 2

Views: 3765

Answers (2)

MBO
MBO

Reputation: 31025

Simply use <%= text_field_tag 'tour[hotel_ids]', nil %> here, and then split like you do in example.

What really happens in your example is that Rails get param(-s) tour[hotel_ids][] in request and it thinks: "ok, so params[:tour][:hotel_ids] is an array, so I'll just push every value with this name as next values to this array", and you get exactly this behavior, you have one element in params[:tour][:hotel_ids] array, which is your value ("1,2"). If you don't need (or don't want) to assign multiple values to same param then don't create array (don't add [] at the end of the name)

Edit:

You can also go easy way (if you only want answer to posted question, not solution to problem why you have now what you expect) and just change your line in controller to:

params[:tour][:hotel_ids] = params[:tour][:hotel_ids][0].split(',')

#split returns array and in your example you assigned this new array to first position of another array. That's why you had array-in-array.

Upvotes: 0

Rock
Rock

Reputation: 1216

This is ruby!

params[:tour][:hotel_ids][0].flatten!

should do the trick!

ps: the '!' is important here, as it causes the 'flatten' to be saved to the calling object.

pps: for those ruby-related questions I strongly suggest experimenting with the irb or script/console. You can take your object and ask for

object.inspect
object.methods
object.class

This is really useful when debugging and discovering what ruby can do for you.

Upvotes: 4

Related Questions