1

У меня есть две модели. Место проведения и категории. Они связаны друг с другом как has_and_belongs_to_manyRails 4 has_and_belongs_to_many

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

venue.rb

class Venue < ActiveRecord::Base 

    has_and_belongs_to_many :categories 

end 

category.rb

class Category < ActiveRecord::Base 

    has_and_belongs_to_many :venues 

end 

Регистрация Таблица

create_table "categories_venues", id: false, force: true do |t| 
    t.integer "category_id", null: true 
    t.integer "venue_id", null: true 
end 

add_index :categories_venues, ["category_id", "venue_id"] 

Большинство exampl es онлайн показывают, как создавать модели с помощью другого. Я не могу понять, как выбрать параметр multi select, где пользователь может выбрать одну или несколько категорий и автоматически сохранить их.

Должен ли я использовать builder в контроллере? и добавить accepts_nested_attributes_for?

Является новым для Rails и пытаюсь выполнить поиск и чтение документов.

Контроллер

def new 
    @venue = Venue.new 

    @categories = Category.all.order('name ASC') 
    @countries = Country.all.order('name ASC').limit(25) 
    @regions = Region.all.order('name ASC').limit(25) 
    @cities = City.all.order('name ASC').limit(25) 

    #render plain: @categories.inspect 

    end 

Посмотреть

<div class="form-group"> 
    <%= f.label :parent_id, "Categories:<span class='mandatory'>*</span>".html_safe,:class => 'col-sm-2 control-label' %> 
    <div class="col-sm-3"> 
     <%= f.collection_select(:category_ids, @categories, :id, :name, { :prompt => true }, { :class => 'select-search', :selected => params[:user_id], :data => { :placeholder => 'Please Choose' } }) %> 
     <%= show_errors(@venue, :category_ids).html_safe %> 
    </div> 
    </div> 

ответ

3

Ну проблема в том, что он не создавал отношения хорошо. Мы исправили это с этим небольшими изменениями:

def category_ids 
    params.permit(category_ids: []) 
end 

def venue_params 
    #removed category_ids from permit 
end 

def create 
    @venue = Venue.new(venue_params) 
    if @venue.save 
    category_ids.each {|id| @venue.categories << Category.find(id)} 
    # rest of the code 
end 

И для обновления:

def update 
    @venue = venue.find(params[:id]) 
    if @venue.update(venue_params) 
     @venue.categories.delete_all 
     category_ids.each {|id| @venue.categories << Category.find(id) } 
+0

является «через» для has_many ? когда я назначаю habtm с соглашениями об именах, я не думаю, что мне нужно сделать это правильно? –

+0

До тех пор, пока отношение происходит через таблицу соединений, вы должны сказать рельсы, что с помощью: через – tebayoso

+0

ладно спасибо. в представлении я собираю все категории и передаю их: category_ids, но когда я пытаюсь отправить и сохранить его, он ожидает, что массив, но получит строку. –

1

Вы можете цикл по всем категориям

= check_box_tag "product[category_ids][]", category.id, @product.categories.include?(category) 

Заменитель местом для продукта.

Ключевым моментом здесь является именование элемента формы ...

Если вы хотите сделать несколько выбора вы можете использовать отборное ... Назовите его соответствующим образом ... Место [category_ids] [] и вы должны настроить его, чтобы выбрать несколько .. Я думаю, что ваши модели установлены правильно, кстати ..

к сожалению, в на мобильный так код не отформатирован

+0

, когда я попытаюсь назвать multiselect, давая мне ошибку. можно сказать, как назвать это <% = f.collection_select (: category_ids, @categories,: id,: name, {: prompt => true}, {: class => 'select-search',: selected => params [: user_id],: data => {: placeholder => 'Пожалуйста, выберите'}})%> –

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