Назначьте категории вновь созданному сообщению с помощью Ruby и Padrino.

Я работаю над своей облегченной CMS Padrino, которая очень похожа по функциям на Wordpress. При создании нового сообщения я хочу иметь возможность назначать их многим из существующих категорий. Почему-то не могу заставить свою форму работать.

Мои модели выглядят так:

Почтовая модель

 class Post < ActiveRecord::Base
   belongs_to :account
   has_many :categorizations
   has_many :categories, :through => :categorizations
   accepts_nested_attributes_for :categories
 end

Модель категории

 class Category < ActiveRecord::Base
  has_many :categorizations
  has_many :posts, :through => :categorizations
  belongs_to :category
 end

Модель категоризации

 class Categorization < ActiveRecord::Base
  belongs_to :post
  belongs_to :category
 end

Я также создал миграцию для совместной таблицы

 class CreateCategorizations < ActiveRecord::Migration
  def self.up
   create_table :categorizations do |t|
     t.integer :category_id
     t.integer :post_id
     t.timestamps
   end
  end

  def self.down
   drop_table :categorizations
  end
 end

И вот связанная часть формы

  <% fields_for :categories do |c| %>
    <fieldset class='control-group <%= error ? 'has-error' : ''%>'>
      <%= c.label 'Category title', :class => 'control-label' %>
      <div class='controls'>
        <%= c.select(:id, :collection => @categories, :fields => [:title, :id], :include_blank => true, :multiple => true, :class => 'form-control input-xlarge input-with-feedback') %>
       <span class='help-inline'><%= error ? c.error_message_on(:id) : "Select a category if there is a parent category" %></span>
     </div>
   </fieldset>
  <% end %>

Я не знаю, что мне не хватает, но ассоциация не создается. Я не упоминаю категории в контроллере во время создания, но заполняю раскрывающийся список существующими категориями. Как-то хотелось связать их с новым постом.

Я буду очень признателен, если кто-то может указать мне правильное направление с этим. Ошибка, которую я получаю, заключается в следующем:

NoMethodError в /admin/posts/create undefined method `each' for nil:NilClass file: collection_association.rb location: replace line: 383

Данные формы POST содержат следующее:

ПОЧТА

Переменная подлинность_токен

Значение c760c21a5d1f85bfc19e179b37d56f67

category_active_record_relation {id=›[2, 3]}

post {post_name=›Test post, post_type=›blogpost, post_title=›Postie, slug=›Это пользовательский набор slug, post_date=›2015-06-30, post_content=›Lorem ipsum dolor sit amet consequtiv, post_excerpt=› Lorem ipsum, post_status=›опубликовано, comment_status=›закрыто, comment_count=›0}

save_and_continue Сохранить и продолжить


person szabcsee    schedule 15.07.2016    source источник


Ответы (1)


Мне удалось ответить на свой вопрос, решение было довольно простым, однако, возможно, есть более красивое, с большим количеством магии. Так или иначе, используя документацию API CollectionProxy, стало понятно, что я могу назначать эти категории в контроллере.

админ/контроллеры/posts.rb

Просто добавьте перед if @post.save

 params[:category_active_record_relation]['id'].each do |category|
    category = Category.find(category)
    @post.categories << category
end

Если бы я создавал новые категории, я мог бы использовать метод @post.categories.build(category).

Надеюсь, это поможет и другим.

person szabcsee    schedule 18.07.2016