2

Ich muss Benutzern erlauben, Tags für ihre Beiträge auszuwählen, aber von geschlossenen Liste (sagen wir, nur Admin kann neue Tags hinzufügen, oder sie sind auf andere Weise vordefiniert). Jeder Beitrag kann viele Tags haben, also muss er Multiselektor sein. Nach dem Hinzufügen von select2-rails konnten Tags leider nicht in der DB gespeichert werden. Wie kann ich es reparieren? This funktioniert nicht für mich.So verwenden Sie select2-rails mit acts_as_tagable_on (simple_form)

Posts:

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 

Modell:

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 

Ausblick:

= 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' 
    }); 
}); 

Antwort

2

Nun, es war viel einfacher als ich dachte. Alles, was ich tun musste, war tag_list als Array tag_list: [] (Standard-Syntax :tag_list wird nicht speichern Tags in DB, wie es here und here beschrieben wurde), aber nur diese Änderung verursacht seltsames Verhalten - Speichern von Tags IDs anstelle von Namen. Die zweite Sache, die in den obigen Links nicht erwähnt wurde, ist die explizite Definition der Label- und Wertmethode für den Selektor (das ist wichtig, weil es standardmäßig IDs von Tags, nicht Tags von Namen übergibt, also neue Tags mit identischen Namen erzeugt IDs früherer Tags).

In Controller:

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

Und in Aussicht:

= 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

was label_method ist und wie ist es anders als value_method? Vielen Dank. –

+0

@TimmyVonHeiss label_method ist, was Sie im Selektor anzeigen, value_method ist, was Sie weitergeben, um in db zu speichern. z.B. Wenn Sie Kategorien haben und Beiträge category_id in db haben, möchten Sie den Kategorienamen im Selektor anzeigen und die Kategorie-ID an db übergeben - Sie setzen label_method wie folgt: name (Kategoriename) und value_method als: id (Kategorie-ID). – weezing