如何使用复选框向帖子添加标签?

时间:2014-01-20 03:06:32

标签: ruby-on-rails ruby

我想通过在帖子和标签之间进行标记来建立多对多关联。用户可以通过检查现有标签来创建带标签的帖子。但我不知道如何创建嵌套表单并保存关联。

我的表格

<%= form_for(@post) do |f| %>

  <div class="field">
    <%= f.label :text %><br />
    <%= f.text_field :text %>
  </div>
  <div>
    <%= hidden_field_tag "post[tag_ids][]", nil %>
      <% Tag.all.each do |tag| %>
      <%= check_box_tag "post[tag_ids][]", tag.id, @post.tag_ids.include?(tag.id) %>
      <%= tag.name %>
    <% end %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

在这里发布控制器:

class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    if @post.save
      redirect_to @post
    else
      render 'new'
    end
  end

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

  private
    def post_params
      params.require(:post).permit(:text)
    end
end

模型

class Post < ActiveRecord::Base
  has_many :taggings
  has_many :tags, :through => :taggings
end

class Tag < ActiveRecord::Base
  has_many :taggings
  has_many :posts, :through => :taggings
end

class Tagging < ActiveRecord::Base
  belongs_to :tag
  belongs_to :post
end

1 个答案:

答案 0 :(得分:0)

在这种情况下,我认为你实际上不需要拥有嵌套表单。当给定属性:tag_ids

时,Rails会自动计算出关联

这就是我为多选form_helper所做的,这需要对check_box助手进行细微更改

f.select :tag_ids, Tag.all.collect {|tag| [tag.name, tag.id]}, {}, :multiple => true