【问题标题】:Rails 5 form_for with checkbox array带有复选框数组的Rails 5 form_for
【发布时间】:2018-06-22 05:19:37
【问题描述】:

我使用的是 PostgreSQL 数据库和 Rails 5.0.6。 我尝试为我工作的学校构建课程分配 WebApp。对于每门课程,教师可以选择允许访问课程的表格。

迁移文件:

  def up
    create_table :courses do |t|
      t.integer :number, null: false
      t.string :name, null: false
      t.text :description, null: false
      t.decimal :level, array: true, default: []
      t.integer :max_visitor, null: false
      t.integer :min_visitor
      t.integer :pos_visit
      t.timestamps
    end
  end

在我的控制器中:

    params.require(:course).permit(:number, :name, :description, :level [], :max_visitor, :min_visitor, :pos_visits)

我已经阅读了这篇文章:Rails 5 strong params with an Array within check boxes values。但是语法 params.require(:product).permit(:id, **category_ids: []**) 对我不起作用,即使我也在使用 rails 5。我不确定:level [] 是否真的有效,但它似乎是正确的语法。

这是我的表格:

<%= form_for @course do |t| %>
            <%= t.text_field :number, class: 'form-control' %>
            <%= t.text_field :name, class: 'form-control' %>
            <%= t.text_area :description, class: 'form-control' %>
            <%= t.check_box :level[], 1%>
            <%= t.check_box :level[], 2%>
            <%= t.check_box :level[], 3%>
            <%= t.check_box :level[], 4%>
            <%= t.text_field :max_visitor, class: 'form-control' %>
            <%= t.text_field :min_visitor, class: 'form-control' %>
            <%= t.text_field :pos_visit, class: 'form-control' %><br/>
        <%= t.submit "bestätigen", class: "btn btn-success"%>
<% end %>

这个 check_box 语法似乎是错误的。 任何人都可以帮助我使用正确的复选框语法吗? 感谢您的帮助。

【问题讨论】:

    标签: ruby-on-rails postgresql checkbox ruby-on-rails-5


    【解决方案1】:
    <%= check_box_tag 'level[]', 1%>
    <%= check_box_tag 'level[]', 2%>
    <%= check_box_tag 'level[]', 3%>
    <%= check_box_tag 'level[]', 4%>
    

    但是当您在 form_for 中使用 check_box_tags 时,参数 level[] 将超出您通常在 controller#new 函数中使用的强参数数组。

    Parameters: {"course"=>{"number"=>"12", "name"=>"tanzen", "description"=>"efwefggw", "max_visitor"=>"12", "min_visitor"=>"5", "pos_visit"=>"2"}, "level"=>["1", "3", "4"], "commit"=>"bestätigen"}
    

    所以我手动添加了关卡

    @course = Course.new(course_params)
    @course.level = params[:level]
    

    【讨论】:

      【解决方案2】:

      为此有一个collection_check_boxes 辅助方法:

      <%= form_for @course do |f| %>
        <%= f.collection_check_boxes(:level, { 'One': 1, 'Two': 2, 'Three': 3 }, :last, :first) %>
      <% end %>
      

      第三个参数是从“集合”中获取值的方法,第四个是从“集合”中获取标签的方法。这个辅助方法会自动将 Hash 转换为数组,这就是我在这里使用 lastfirst 的原因。

      也可以按照您想要的方式设置样式,例如使用引导:

      <%= f.collection_check_boxes(:level, { 'One': 1, 'Two': 2, 'Three': 3 }, :last, :first) do |b| %>
        <div class="form-check form-check-inline">
          <%= b.check_box class: 'form-check-input' %>
          <%= b.label class: 'form-check-label' %>
        </div>
      <% end %>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 2016-11-21
        • 2014-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多