首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在acts_as_taggable_on (simple_form)中使用select2-rails

如何在acts_as_taggable_on (simple_form)中使用select2-rails
EN

Stack Overflow用户
提问于 2016-04-09 18:45:20
回答 1查看 895关注 0票数 2

我需要允许用户为他们的帖子选择标签,但是从封闭的列表(假设只有管理员可以添加新的标签,或者他们是以其他方式预定义的)。每个帖子可以有很多标签,所以它需要多个选择器。不幸的是,在添加select2-rails之后,标签无法保存在DB中。我怎么才能修好它呢?This不适合我。

PostsController:

代码语言:javascript
复制
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

型号:

代码语言:javascript
复制
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

查看:

代码语言:javascript
复制
= 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:

代码语言:javascript
复制
$(document).ready(function(){
  $('.tags').select2({
    placeholder: 'Click to select',
    theme: 'bootstrap'
  });
});
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-09 18:53:31

比我想象的要容易得多。我所要做的就是允许tag_list作为数组tag_list: [] (默认语法:tag_list不会像描述herehere那样在DB中保存标记),但是只有这种更改才会导致奇怪的行为保存标记I而不是名称。在上面的链接中没有提到的第二件事是为选择器明确定义标签和值方法(这很重要,因为在默认情况下,它将传递标签ids,而不是标签名称,因此它将创建与以前标记ids相同的新标记)。

在主计长:

代码语言:javascript
复制
def post_params
  params.require(:post).permit(:title, :header, :content, tag_list: [])
end

从以下角度来看:

代码语言:javascript
复制
= 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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36521141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档