【问题标题】:Rails: How to pass params of multiple checkbox to the modelRails:如何将多个复选框的参数传递给模型
【发布时间】:2019-11-12 17:09:05
【问题描述】:

我构建了这个表单,它为我生成了一些带有“U6”、“U8” eccc 等值的 chebox

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

现在我必须将选定复选框的值传递给我模型中的方法。 现在是:

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

我想将 TeamCategory::NAMES.each do 替换为“selected check_box each do”,并将 TeamCategory.where(name: name) 替换为所选值。

提前谢谢你

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    我是 Rails 的新手。我看到的是你参加了表格的一部分来创建团队,对吧?

    对于您的代码,它可能是:

    <%= 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 %>
    
    

    您的表单允许选择多个类别。

    对于方法:

    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
    

    您可能会在您的teams_controller.rb 中使用此方法。在控制器中,您应该能够从参数中检索一个新创建的选定名称数组,其中包含与此类似的内容。

    @category_names_selected = params[:category_names_selected]
    

    我不知道您的应用程序有多复杂,因此它也可能嵌套在您的参数哈希中的["team"][:category_names_selected]["team"]["category_names_selected"] 下。

    要查看参数哈希的确切结构并调整上面的等式,您可以在控制器文件的顶部添加例如require 'pry',然后在执行方法的部分之后添加binding.pry。当您重新启动服务器并且应用程序访问控制器的这一部分时,您应该能够在终端中看到参数哈希的确切结构。

    然后您可以将数组传递给您可以在控制器中调用的方法。不要忘记将 :category_names_selected 添加到控制器中的强参数中。我希望这会有所帮助。

    【讨论】:

    • 您好,谢谢您的回答...我在终端中看到此错误:ArgumentError - 参数数量错误(给定 0,预期为 1):app/models/tournament.rb:77:在create_tournament_team_categories' app/controllers/tournaments_controller.rb:30:in create'。但值传递正确:“category_names_selected”=>[“U10”,“U12”,“U14”]
    • 我假设我们编辑的方法在第 77 行的 app/models/tournament.rb:77 文件中。该方法需要一个参数 => category_names_selected 数组。所以它可能没有在你的控制器的方法中传递。有没有办法可以在这里发布你的 tours_controller.rb?我对第 30 行附近发布的方法特别感兴趣。
    • 据我猜测它可能是create 方法,您需要将其调整为类似于def create @category_names_selected = params[:category_names_selected] #your code here #and in the part where the method create_tournament_team_categories is使用你需要编辑它看起来像create_tournament_team_categories(@category_names_selected)但这只是我的猜测,如果你发布控制器,我可以给你更多细节。
    • 是的,在第 30 行,我有 create 方法
    • def create @tournament = Tournament.new(tournament_params) @tournament.sport_club = current_user.sport_club @category_names_selected = Tournament.new(params[:tournament][:category_names_selected]) if @tournament.save redirect_to tournaments_path, notice: 'Torneo creato con successo' end end
    【解决方案2】:

    第 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
    

    模型中的方法 create_tournament_team_categories

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2020-04-09
      • 2018-04-24
      相关资源
      最近更新 更多