Davide Sovrano
Davide Sovrano

Reputation: 45

Rails: How to pass params of multiple checkbox to the model

i built this form that generate me some chebox with value like "U6", "U8" eccc

<%= form.label "Seleziona Categorie" %>
      <% TeamCategory::NAMES.each do |category| %>
        <%= check_box_tag 'categories_selected[]', category -%>
      <% end %>

Now i have to pass the value of selected check_box to a method in my model. Now is:

def create_tournament_team_categories
    TeamCategory::NAMES.each do |name|
      team_category = TeamCategory.where(name: name).first_or_create
      self.tournament_team_categories << TournamentTeamCategory.create(team_category: team_category)
    end
  end

I would like to replace the TeamCategory::NAMES.each do with "selected check_box each do" and TeamCategory.where(name: name) with the value selected.

Thank you in advance

Upvotes: 0

Views: 659

Answers (2)

Davide Sovrano
Davide Sovrano

Reputation: 45

Controller on line 30

def create
    @tournament = Tournament.new(tournament_params)
    @tournament.sport_club = current_user.sport_club
    @category_names_selected = params[:category_names_selected]

    if @tournament.save
      redirect_to tournaments_path, notice: 'Torneo creato con successo'
    end
  end

Method create_tournament_team_categories in the model

after_create :create_tournament_team_categories

 def create_tournament_team_categories(category_names_selected)
    @category_names_selected.each do |name|
      team_category = name
      self.tournament_team_categories << TournamentTeamCategory.create(team_category: team_category)
    end
  end

Upvotes: 0

iseitz
iseitz

Reputation: 71

I am a newbie with Rails. What I see is that you took the part of the form to create the team, right?

For your code straight forward it could be:

<%= form.label "Seleziona Categorie" %>
      <% TeamCategory::NAMES.each do |name| %> #you are looping through team category NAMES constant
        <%= check_box_tag 'category_names_selected[]', name %>
      <% end %>

Your form as is allows more than one category to be selected.

For the method:

def create_tournament_team_categories(category_names_selected)
    category_names_selected.each do |name|
      team_category = name
      self.tournament_team_categories << TournamentTeamCategory.create(team_category: team_category)
    end
  end

you will probably use this method in your teams_controller.rb. In the controller, you should be able to retrieve from params a freshly created array of selected names with something along the lines with this.

@category_names_selected = params[:category_names_selected]

I do not know how complicated your app is so it might also be nested under ["team"][:category_names_selected] or ["team"]["category_names_selected"] in your params hash.

To see the exact structure of the params hash and adjust the equation above you can add for example require 'pry' at the top of your controller file and then but the binding.pry just after the part where your method is executed. When you restart the server and the app hits this part of the controller you should be able to see the exact structure of your params hash in the terminal.

You can then pass the array to the method that you can call in the controller. Do not forget to add :category_names_selected to the strong params in the controller. I hope this helps.

Upvotes: 1

Related Questions