2014-02-05 2 views
3

Я создаю макет «Приложение для заказа 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 %> 

Все, кроме флажки для «мяса» работают, и если я изменю свой тип поля в модели для «мяса» от Array до String, я могу представить va lue из последнего флажка ... но если я попытаюсь передать массив из флажков, я получу ошибку «Проблема: значение типа String не может быть записано в поле типа Array».

Все остальные вопросы, которые я видел в этой теме, рекомендуют делать что-то в соответствии с тегами 'tag_ids = params [: tag_ids]' в контроллере, но я не уверен, как это реализовать.

Заранее благодарим за помощь.

+0

Возможно, это может привести вас к правильному пути: http://apidock.com/rails/ActionView/Helpers/FormTagHelper/check_box_tag#64-Pass-id-collections-with-check-box-tags – Benj

+0

Спасибо @BenjaminSinclaire , У меня был пробел в моем понимании, но ваш пост был, безусловно, полезен. –

ответ

5

Код, который в конечном итоге позволяет все правильно работать, заключается в следующем. В конечном счете, Я считаю, что ключевым отличием было «мясо: []» в контроллере.

Модель:

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

Надеется, что это помогает кому-то.

+0

Я получаю сообщение об ошибке «Синтаксическая ошибка, неожиданность»: ', expecting') '', при использовании' мясо: [] ' – Gcap

+0

звучит как синтаксическая ошибка :) ... где-то отсутствует закрывающая скобка? сложно сказать без вашего кода –

+0

У меня в контроллере: 'params.require (: user_story) .permit (: Story,: Tags,: Context, DiD_Layer: [], Atk_Stage: [],: Status)'. И в моей модели оно задано как 'field: DiD_Layer, type: Array, default: []' – Gcap

Смежные вопросы