2

Мне нужно разрешить пользователям выбирать теги для своих сообщений, но из закрытого списка (скажем, только админ может добавлять новые теги или они предопределены другим способом). Каждый пост может иметь много тегов, поэтому он должен быть мультиселектором. К сожалению, после добавления меток select2-rails не удалось сохранить в БД. Как я могу это исправить? This не работает для меня.Как использовать select2-rails с act_as_taggable_on (simple_form)

PostsController:

class PostsController < ApplicationController 
    before_action :find_post, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user!, only: [:new, :create, :edit, :update, :destroy] 

    def index 
    @posts = Post.page(params[:page]).per(10) 
    @tags = ActsAsTaggableOn::Tag.all 
    end 

    def new 
    @post = current_user.posts.new 
    @tags = ActsAsTaggableOn::Tag.all 
    end 

    def create 
    @post = current_user.posts.new(post_params) 
    if @post.save 
     redirect_to @post, notice: _('Post created') 
    else 
     render :new, notice: _('Something went wrong') 
    end 
    end 

    def show 
    @tags = ActsAsTaggableOn::Tag.all 
    end 

    def edit 
    authorize @post 
    @tags = ActsAsTaggableOn::Tag.all 
    end 

    def update 
    if @post.update(post_params) 
     redirect_to @post, notice: _('Post updated') 
    else 
     render :edit, notice: _('Something went wrong') 
    end 
    end 

    def destroy 
    authorize @post 
    if @post.destroy 
     redirect_to root_path, notice: _('Post deleted') 
    else 
     redirect_to @post, notice: _('Something went wrong') 
    end 
    end 

    private 

    def post_params 
    params.require(:post).permit(:title, :header, :content, :tag_list) 
    end 

    def find_post 
    @post = Post.friendly.find(params[:id]) 
    end 
end 

Модель:

class Post < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :title, use: :slugged 
    acts_as_ordered_taggable_on :tags 

    belongs_to :user 

    validates :title, :header, :content, presence: true 
    validates :title, uniqueness: true 
end 

Вид:

= simple_form_for @post do |f| 
    = f.input :title 
    = f.input :header 
    = f.input :content, input_html: { rows: 10 } 
    = f.input :tag_list, collection: @tags, input_html: { multiple: true, class: 'tags' } 
    = f.submit 'Save', class: 'btn btn-warning' 
= link_to _('Back'), :back 

application.js:

$(document).ready(function(){ 
    $('.tags').select2({ 
    placeholder: 'Click to select', 
    theme: 'bootstrap' 
    }); 
}); 

ответ

2

Ну, это было намного проще, чем я думал. Все, что мне нужно было сделать, это разрешить tag_list как массив tag_list: [] (синтаксис по умолчанию :tag_list не сохранит теги в БД, как описано here и here), но только это изменение вызвало странное поведение - сохранение тегов ids вместо имен. Второе, что не упоминалось в приведенных выше ссылках, заключается в том, чтобы объяснить определение меток и метода значений для селектора (важно, поскольку по умолчанию он будет передавать идентификаторы тегов, а не теги, поэтому он будет создавать новые теги с именами, идентичными идентификаторы предыдущих тегов).

В контроллере:

def post_params 
    params.require(:post).permit(:title, :header, :content, tag_list: []) 
end 

А Вид:

= simple_form_for @post do |f| 
    = f.input :title 
    = f.input :header 
    = f.input :content, input_html: { rows: 10 } 
    = f.input :tag_list, collection: @tags, value_method: :name, label_method: :name, input_html: { multiple: true, class: 'tags' } 
    = f.submit 'Save', class: 'btn btn-warning' 
= link_to _('Back'), :back 
+0

что такое label_method и как это отличается от value_method? Благодарю. –

+0

@TimmyVonHeiss label_method - это то, что вы показываете в селекторе, value_method - это то, что вы передаете для сохранения в db. , например. если у вас есть категории, а сообщения имеют category_id в db, вы хотите показать название категории в селекторе и идентификатор категории пропуска на db - вы устанавливаете label_method как: name (название категории) и value_method как: id (идентификатор категории). – weezing

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