2

Kullanıcıların gönderileri için etiket seçmelerine izin vermeliyim, ancak kapalı listeden (yalnızca yöneticinin yeni etiket ekleyebileceğini veya başka şekilde önceden tanımlanmış olduğunu söyleyebiliriz). Her gönderinin çok sayıda etiketi olabilir, bu yüzden çoklu ayırıcı olması gerekir. Maalesef, select2 raylarını ekledikten sonra etiketler DB'ye kaydedilemedi. Bunu nasıl düzeltebilirim? This benim için çalışmıyor.select2 rayları acts_as_taggable_on (simple_form) ile nasıl kullanılır

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 

Modeli:

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 

Görünüm:

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

cevap

2

Şey, düşündüğümden çok daha kolaydı. Yapmam gereken tek şey tag_list: [] dizisi olarak tag_list dizisine izin vermekti (varsayılan sözdizimi :tag_list, here ve here açıklandığı şekilde DB'ye etiketleri kaydetmeyecektir), ancak yalnızca bu değişiklik adlar yerine garip davranış kaydetme etiketlerine neden olmuştur. Yukarıdaki bağlantılarda belirtilmeyen ikinci şey, açıklık için seçicinin etiketini ve değer yöntemini tanımlamaktır (bu önemlidir, çünkü varsayılan olarak etiketlerin adlarını değil, etiketlerin adlarını geçecektir, böylece aynı isimle yeni etiketler oluşturacaktır) önceki etiketlerin kimlikleri). denetleyici olarak

:

label_method nedir
= 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

ve nasıl value_method farklıdır:

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

Ve View

? Teşekkürler. –

+0

@TimmyVonHeiss label_method, selektörde görüntülediğiniz şeydir, value_method, db'ye kaydetmek için geçirdiğiniz şeydir. , ör. kategorileriniz varsa ve kategorilerinde db durumunda category_id varsa, kategori adını selektörde göstermek ve kategori kimliğini db'ye geçirmek için - label_method değerini aşağıdaki gibi ayarladınız: name (kategori adı) ve value_method as: id (kategori kimliği). – weezing