如何使用 select2-rails 和 acts_as_taggable_on (simple_form)
How to use select2-rails with acts_as_taggable_on (simple_form)
我需要允许用户为他们的 post 标记 select,但是来自封闭列表(假设只有管理员可以添加新标记,或者它们以其他方式预定义)。每个post可以有多个标签,所以需要multiselector。不幸的是,添加 select2-rails 标签后无法保存在数据库中。我该如何解决? 对我不起作用。
帖子控制器:
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'
});
});
嗯,这比我想象的要容易得多。我所要做的就是允许 tag_list
作为数组 tag_list: []
(默认语法 :tag_list
不会在数据库中保存标签,正如 and 所描述的那样),但仅此而已更改导致奇怪的行为 - 保存标签 ID 而不是名称。第二件事,在上面的链接中没有提到,是为选择器明确定义标签和值方法(这很重要,因为默认情况下它会传递标签的 id,而不是标签名称,因此它将创建名称与以前标签的 ID)。
在控制器中:
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
我需要允许用户为他们的 post 标记 select,但是来自封闭列表(假设只有管理员可以添加新标记,或者它们以其他方式预定义)。每个post可以有多个标签,所以需要multiselector。不幸的是,添加 select2-rails 标签后无法保存在数据库中。我该如何解决?
帖子控制器:
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'
});
});
嗯,这比我想象的要容易得多。我所要做的就是允许 tag_list
作为数组 tag_list: []
(默认语法 :tag_list
不会在数据库中保存标签,正如
在控制器中:
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