2014-01-05 4 views
1

Я застрял в том, что хотя мой параметр массива захватывается, он не может вставить его в базу данных. Я не получаю ошибку параметров, которые не были пропущены, или что-то еще. Он просто не распознает массив при вставке в БД.Вставка блока checkbox в базу данных

То, что я хотел бы сделать: Захват любой ящик, проверяется выключен, и вставить данные в отдельных строк в базу данных.

Вот что у меня есть:

/подписаться/категории/2

<div> 
    <%= simple_form_for @subscription do |f| %> 
     <div class="form-inputs"> 
      <%= f.hidden_field :dashboard_id, value: 1 %> 
      <%= f.hidden_field :category_id, value: @category.id %> 
      <%= f.collection_check_boxes :feed_id, Feed.where("category_id = ?", @category), :id, :name %> 
     </div> 
     <div class="form-actions"> 
     <%= f.button :submit %> 
     </div>   
    <% end %> 
</div> 

CategoriesController

def show 
    @subscription = Subscription.new 
    end 

SubscriptionsController

def subscription_params 
    params.require(:subscription).permit(:dashboard_id, :category_id, :feed_id => []) 
end 

Когда представлен, здесь й е консольный вывод:

Processing by SubscriptionsController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"Zw2VkwujDLQjV4krjPF8N1EiYo5L/XOrUwedlHCvwB0=", "subscription"=>{"dashboard_id"=>"1", "category_id"=>"2", "feed_id"=>["3", "4", ""]}, "commit"=>"Create Subscription"} 
    (0.2ms) BEGIN 
    SQL (1.6ms) INSERT INTO `subscriptions` (`category_id`, `created_at`, `dashboard_id`, `updated_at`) VALUES (2, '2014-01-06 02:17:41', 1, '2014-01-06 02:17:41') 
    (116.6ms) COMMIT 
Redirected to http://localhost:3000/subscriptions/3 
Completed 302 Found in 173ms (ActiveRecord: 119.3ms) 

Два вопроса:

  1. Почему есть дополнительный "" для моего FEED_ID массива? (Только 2 возможных флажка)
  2. Почему я не собираю массив, чтобы вставить его в базу данных?

Спасибо!

+0

У вас есть attr_accessible: feed_ids в вашей модели? – Danny

+0

Сильные параметры перечислены выше. Я использую feed_id, а не feed_ids. Когда я использую feed_ids, он указывает, что атрибут не существует. –

ответ

0

Для тех, кто хочет знать, как это сделать, вот одно из решений, которое я придумал. Все в моем первом сообщении остается тем же. В моей SubscriptionsController (из которого создается форма), вот мой создать действие:

def create 
    dashboard = params[:subscription][:dashboard_id] 
    category = params[:subscription][:category_id] 
    feed = params[:subscription][:feed_id] 

    @subscription = feed.map { |subscribe| Subscription.create(dashboard_id: dashboard, category_id: category, feed_id: subscribe) } 
    end 

работает как рекламируется. Если кто-то думает по какой-то причине, что я упускаю из виду это ужасная идея, прокомментируйте.

0

Причина, по которой ваш массив не вставлен в базу данных, заключается в том, что Active Record в настоящее время не поддерживает тип массива Postgresql. Чтобы вставить их в виде отдельных строк, флажки должны быть представлены как отдельные экземпляры модели.

Возможно, что-то вроде ...

Category < ActiveRecord::Base 
    has_many: feeds 
    ... 
end 

Feed < ActiveRecord::Base 
    belongs_to: category 
    ... 
end 

Теперь это также будет означать, что вам нужно будет использовать помощник form_tag вместо form_for. Это позволит создать композитную форму, состоящую из нескольких отдельных объектов. Вставка этого означала бы только итерацию и вставку над каждым объектом; давая вам отдельные строки. Надеюсь это поможет.

+0

Спасибо за помощь. У меня уже есть настройка отношений, как вы объясните, и я понимаю, как вставлять form_tag вместо form_for. Однако есть ли у вас пример «Вставка это означало бы только повторение и вставку над каждым объектом»? –

+0

Это может вас заинтересовать: [ActiveRecord Import] (https://github.com/zdennis/activerecord-import).Это позволяет реализовать массивную вставку вашего массива. – rafroehlich2

+0

Интересно, я посмотрю. Я на самом деле очень шокирован Rails/ActiveRecord не имеет способа сделать это ... –

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