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

时间:2014-02-05 04:58:29

标签: ruby-on-rails checkbox ruby-on-rails-4 form-for

我正在铁轨中创建一个模拟“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

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

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

以下是我认为的表格:

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

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

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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

控制器:

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

并查看:

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

希望这有助于某人。