9

I have a form that creates new users. I am trying to add a drop down option to select permission levels. I want to be able to select multiple permission levels per user.

This is my view, I added {:multiple => true} :

<%= f.label :permission, "Permission Level" %>
<%= f.select :permission, [ ["Read Only", "read"], ["IP Voice Telephony", "ip_voice"], ["IP Video Telephony", "ip_video_telephony"], ["Enterprise Gateways", "enterprise_gateways"], ["Consumer ATAs", "consumer_atas"], ["IP PBX", "ip_pbx"], ["Master of All", "all"] ], {prompt: "Select Permission Level"}, {:multiple => true}, class: "input-lg" %>

My controller, I added :permission => [] :

def user_params
  params.require(:user).permit(:name, :email, :password, :password_confirmation, :admin, :permission => [])
end

The error I get for my view, f.select:

wrong number of arguments (5 for 2..4)

How do you make a select multiple for Rails 4?

DDDD
  • 3,790
  • 5
  • 33
  • 55

3 Answers3

14

class and multiple are both part of html_options, so they should go together in a single hash.

Change

<%= f.select :permission, [ ["Read Only", "read"], ["IP Voice Telephony", "ip_voice"], ["IP Video Telephony", "ip_video_telephony"], ["Enterprise Gateways", "enterprise_gateways"], ["Consumer ATAs", "consumer_atas"], ["IP PBX", "ip_pbx"], ["Master of All", "all"] ], {prompt: "Select Permission Level"},
{:multiple => true}, class: "input-lg" %>

To

<%= f.select :permission, [ ["Read Only", "read"], ["IP Voice Telephony", "ip_voice"], ["IP Video Telephony", "ip_video_telephony"], ["Enterprise Gateways", "enterprise_gateways"], ["Consumer ATAs", "consumer_atas"], ["IP PBX", "ip_pbx"], ["Master of All", "all"] ], {prompt: "Select Permission Level"},
{:multiple => true, class: "input-lg"} %>

Right now you are passing them separately. So, the argument count for select method is becoming 5 when it should be 4. Hence, the error.

mwfearnley
  • 3,303
  • 2
  • 34
  • 35
Kirti Thorat
  • 52,578
  • 9
  • 101
  • 108
6

Your option for :class is not in the hash for html_options:

{:multiple => true}, class: "input-lg"

should be

{:multiple => true, class: "input-lg"}
  • When you use the helpers in a form builder it's a little confusing because they take one fewer option than the non-wrapped versions, since the form builder itself gives the object. –  Apr 23 '14 at 19:36
4

I didn't test it so far but the error message is pretty straight forward, you are trying to use the #select method using 5 params and it accepts at most 4 params, reading the API it seems that you should provide the 'class' attribute in the same hash you have provided the 'multiple' as they both are html_options.

Try to use it like this:

<%= f.select :permission,
             [ ["Read Only", "read"],
               ["IP Voice Telephony", "ip_voice"],
               ["IP Video Telephony", "ip_video_telephony"],
               ["Enterprise Gateways", "enterprise_gateways"],
               ["Consumer ATAs", "consumer_atas"],
               ["IP PBX", "ip_pbx"],
               ["Master of All", "all"] ],
             {prompt: "Select Permission Level"},
             {multiple: true, class: "input-lg"} %>

It would also be good to have that permissions array decoupled to another place. Perhaps it will help to maintain.

http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#method-i-select

pedrofs
  • 612
  • 1
  • 6
  • 14