Acts-As-Taggable Rails gem で遊んでいます。タグモデルが存在しない「post_id」を探していると思われるため、次のメッセージが表示されます (代わりに、投稿モデル/テーブル内の「id」)。
これを機能させるには、モデルまたはコントローラーを変更する必要がありますか?
投稿を表示しようとするとエラーが発生します。
更新: - エラーは投稿ビュー (show.html.erb) が原因のようです。投稿ビューは、投稿モデル (tag_list) を参照します。
エラー:
Mysql2::Error: Unknown column 'taggings.post_id' in 'where clause': SELECT `tags`.* FROM `tags` INNER JOIN `taggings` ON `tags`.`id` = `taggings`.`tag_id` WHERE `taggings`.`post_id` = 4
ポストコントローラー (ショー);
def show
@post = Post.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.json { render json: @post }
end
end
show.html.erb を投稿します。
<%= form_for(@post) do |post_form| %>
..
<div class="field">
<%= post_form.label :tag_list, "Tags (separated by commas)" %><br />
<%= post_form.text_field :tag_list %>
</div>
ポストモデル:
class Post < ActiveRecord::Base
attr_accessible :content, :name, :title, :tag_list #:tags_attributes
has_many :taggings
has_many :tags, through: :taggings
def self.tagged_with(name)
Tag.find_by_name!(name).posts
end
def self.tag_counts
Tag.select("tags.*, count(taggings.tag_id) as count").
joins(:taggings).group("taggings.tag_id")
end
def tag_list
tags.map(&:name).join(", ")
end
def tag_list=(names)
self.tags = names.split(",").map do |n|
Tag.where(name: n.strip).first_or_create!
end
end
#Validations
validates :name, :presence => true
validates :title, :presence => true,
:length => { :minimum => 5 }
has_many :comments, :dependent => :destroy
# accepts_nested_attributes_for :tags, :allow_destroy => :true,
# :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }
end
タグ モデル:
class Tag < ActiveRecord::Base
belongs_to :post
has_many :taggings
has_many :posts, through: :taggings
end
タグ付けモデル:
class Tagging < ActiveRecord::Base
belongs_to :tag
belongs_to :post
end