2016-09-20 2 views
2

Я не могу получить has_many: через Ассоциацию работать. И мне нужно установить что-то лишнее в методе create из post_controller, чтобы сохранить также post_category? (Под кодом ошибки и мои попытки)has_many: через Ассоциацию, NoMethodError (неопределенный метод `each 'for" ": String) и сохранить связь

У меня есть has_many: через ассоциации с почтой, post_category и, как присоединиться таблицы категоризации следующим образом:

Почте Модель:

class Post < ApplicationRecord 
    has_many :categorizations 
    has_many :post_categories, :through => :categorizations 
end 

В Post :: категории Модель (используется для улучшения Пространства имен структуры проекта):

class Post::Category < ApplicationRecord 
    has_many :categorizations 
    has_many :posts, :through => :categorizations 
end 

категоризация Модель (используются class_name, причина именования почт :: Категория):

class Categorization < ApplicationRecord 
    belongs_to :post 
    belongs_to :post_category, :class_name => 'Post::Category' 
end 

И тогда я в представлении отборное, где я создаю пост с post_category:

<div class="form-group"> 
    <%= f.label :post_categories, :class => 'control-label', :value => 'Category: ' %> 
    <%= f.select :post_categories, options_from_collection_for_select(all_post_categories, :id, :name), {}, {class: 'selectpicker', :'data-live-search' => 'true', required: 'false' } %> 
</div> 

В posts_controller, я позволил :post_categories символ:

def post_params 
    params.require(:post).permit(:post_categories) 
end 

вот мой файл миграции для Ассоциации:

class CreateCategorizations < ActiveRecord::Migration[5.0] 
    def change 
    create_table :categorizations do |t| 
     t.integer :post_id 
     t.integer :post_category_id 

     t.timestamps 
    end 
    add_index :categorizations, :post_id 
    add_index :categorizations, :post_category_id 
    # multiple-key index enforces uniqueness on (post_id, post_category_id) 
    # pairs, so that a category can't have the same post twice 
    add_index :categorizations, [:post_id, :post_category_id], unique: true 
    end 
end 

Когда я пытаюсь отправить форму, я получаю следующее сообщение об ошибке в логах:

NoMethodError (undefined method `each' for "3":String): 
app/controllers/posts_controller.rb:32:in `create' 

Так что я искал ответы на некоторые вопросы в порядке ->You can't assign string to association.

Я пробовал еще один способ заставить ассоциацию работать.

Так что я попытался с помощью post_category_id, как рекомендуется here

Я поставил в избранных мнение о

<%= f.select :post_category_id, options_from_collection_for_select(all_post_categories, :id, :name), {}, {class: 'selectpicker', :'data-live-search' => 'true', required: 'false' } %> 

затем в posts_controller позволяют CATEGORY_ID:

def post_params 
    params.require(:post).permit(:post_category_id) 
end 

и в Модель сообщения:

class Post < ApplicationRecord 
    has_many :categorizations 
    has_many :post_category_id, :through => :categorizations 
end 

Это новая ошибка:

Could not find the source association(s) "post_category_id" or :post_category_id in model Categorization. Try 'has_many :post_category_id, :through => :categorizations, :source => <name>'. Is it one of post or post_category? 

Ok имеет смысл, потому что нет post_category_id ассоциации.

Обновление:

В post_params:

<ActionController::Parameters {"content"=>"content", "post_categories"=>"2"} permitted: true> 
+0

Вы действительно ожидаете, что это 'has_many: post_category_id,: through =>: категоризация' работать? –

+0

@AndreyDeineko Это была попытка показать, что я попробовал другой подход. Да, но в конце концов это определенно не сработает – ronatory

+0

Вы могли бы добавить параметры (из журналов) из создания действия при создании сообщения? (При первоначальной настройке) –

ответ

1

Я понял, правильное решение для меня с этим answer и этим question.

Первое решение, чтобы просто сохранить один Post :: Категория с Post

Что касается к этому answer, я должен был изменить параметр разрешения в posts_controller к этому:

def post_params 
    params.require(:post).permit(:post_category_ids) 
end 

Тогда я также необходимо изменить выбор в представлении, в котором я создаю сообщение с post_category:

<div class="form-group"> 
    <%= f.label :post_category_ids, :class => 'control-label', :value => 'Category: ' %> 
    <%= f.select :post_category_ids, options_from_collection_for_select(all_post_categories, :id, :name), {}, {class: 'selectpicker', :'data-live-search' => 'true', required: 'false' } %> 
</div> 

Вот и все. Остальная часть кода по-прежнему остается такой же, как я показал перед моей второй попыткой в ​​моем вопросе.

Второе решение, чтобы сохранить несколько Post :: Категория с сообщение

Касательно этого question, мне нужно изменить параметр разрешения в posts_controller к этому:

def post_params 
    params.require(:post).permit(:post_category_ids => []) 
end 

И выбрать более одной должности: Категория в то же время, мне нужно добавить multiple: 'true' на выбор:

<div class="form-group"> 
    <%= f.label :post_category_ids, :class => 'control-label', :value => 'Category: ' %> 
    <%= f.select :post_category_ids, options_from_collection_for_select(all_post_categories, :id, :name), {}, {class: 'selectpicker', :'data-live-search' => 'true', required: 'false', multiple: 'true' } %> 
</div> 
0

Я думаю, что вам нужно изменить:

<%= f.select :post_categories, options_from_collection_for_select(all_post_categories, :id, :name), {}, {class: 'selectpicker', :'data-live-search' => 'true', required: 'false' } %> 

к этому:

<%= f.select :post_categories[:id], 
    options_from_collection_for_select(all_post_categories, :id, :name), 
    class: 'selectpicker', :'data-live-search' => 'true', required: 'false' , include_hidden: false} %> 

Стреляй, если я ошибаюсь.

Отредактировано: содержит скрытую ложь для рельсов 4.2+ согласно SO 4585355

+0

Спасибо, но теперь я получаю сообщение об ошибке« неявное преобразование символа в Integer » – ronatory

+0

попробуйте использовать 'post_categories [id] ' –

+0

не работает, 'неопределенная локальная переменная или метод id' – ronatory

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