使用复选框将值提交给数组

Kyl*_*dha 3 checkbox ruby-on-rails form-for ruby-on-rails-4

我正在铁轨中创建一个模拟"Chipotle订购应用程序",我很难用复选框提交不同类型的肉.我尝试使用'check_box'和'check_box_tag',在我的模型中使用了几个配置,但无济于事.

这是我的模型:

class Order
  include Mongoid::Document
  field :type, type: String
  field :meat, type: Array
  field :cheese, type: Mongoid::Boolean

  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

这是我的控制器中的创建操作:

def create
  @order = Order.new(order_params)

  if @order.save
    flash[:notice] = "Successfully submitted order!"
    redirect_to action: 'index'
  else
    render action: 'new'
  end
end

private
def order_params
  params.require(:order).permit(:type, :meat, :cheese)
end
Run Code Online (Sandbox Code Playgroud)

以下是我认为的表格:

<%= form_for @order do |order| %>
  <div>
    <%= order.label :type %>:
    <%= order.select :type, options_for_select(['Burrito', 'Taco', 'Quesadilla', 'Salad Bowl']) %>
  </div>

  <div>
    <%= order.label :meat %>
    <%= order.check_box :meat, {}, value='chicken'%>
    <%= order.check_box :meat, {}, value='steak'%>
    <%= order.check_box :meat, {}, value='tofu'%>
  </div>

  <div>
    <%= order.label :cheese %>:
    <%= order.check_box :cheese %>Yes
  </div>

  <div><%= order.submit %></div>

<% end %>
Run Code Online (Sandbox Code Playgroud)

除了'meat'复选框之外的所有内容,如果我将'meat'模型中的字段类型从Array更改为String,我可以提交最后一个复选框的值...但是如果我尝试提交一个数组来自复选框,我收到错误'问题:类型字符串的值不能写入Array类型的字段'.

我在这个主题上看到的所有其他问题都建议在控制器中执行"tag_ids = params [:tag_ids]"的操作,但我不确定如何实现它.

在此先感谢您的帮助.

Kyl*_*dha 5

最终允许一切正常运行的代码如下.最后,我认为关键的区别在于控制器中的'meat:[]'.

模型:

class Order
  include Mongoid::Document
  field :type, type: String
  field :meat, type: Array, default: []
  field :cheese, type: Mongoid::Boolean

  belongs_to :user
end
Run Code Online (Sandbox Code Playgroud)

控制器:

def create
  @order = Order.new(order_params)

  if @order.save
    redirect_to action: 'index'
    flash[:notice] = "Successfully submitted order!"
  else
    render action: 'new'
  end
end

private
def order_params
  params.require(:order).permit(:type, :cheese, meat: [])
end
Run Code Online (Sandbox Code Playgroud)

并查看:

<%= form_for @order do |f| %>
  <div>
    <%= f.label :type %>:
    <%= f.select :type, ['Burrito', 'Taco', 'Quesadilla', 'Salad Bowl'] %>
  </div>

  <div>
    <%= f.label :meat %>
    <%= check_box_tag 'order[meat][]', 'chicken', @order.meat.include?('chicken') %>
    <%= check_box_tag 'order[meat][]', 'steak', @order.meat.include?('steak') %>
    <%= check_box_tag 'order[meat][]', 'tofu', @order.meat.include?('tofu') %>
  </div>

  <div>
    <%= f.label :cheese %>:
    <%= f.check_box :cheese %>Yes
  </div>

  <div><%= f.submit %></div>

<% end %>
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.