0

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
4

1 に答える 1

0

何時間もいじり回した後、ようやくこれが機能するようになりました。基本的に、タグへの以前の参照をすべて削除する必要がありました - 特にポストコントローラーとポストビューで。

次に、以下のリンクで説明されている手順に従って、Acts-As-Taggable gem をインストールしました。 http://ericlondon.com/tag/acts-as-taggable-on

# add acts as taggable on gem, for tagging (clearly optional)
# edit file: Gemfile
+gem 'acts-as-taggable-on'

# execute bundle to install gems
$ bundle

# create Post model
$ rails generate model Post title:string content:text

# add taggable property to Post model & make mass-assignable
# file: app/models/post.rb
 class Post < ActiveRecord::Base
+  attr_accessible :content, :title, :tag_list
+  acts_as_taggable_on :tags
 end

# run acts as taggable migration
$ rails generate acts_as_taggable_on:migration

# setup database
$ rake db:migrate

タグモデルのフィールド名「名前」で競合が発生していたため、投稿モデルから「名前」というフィールドを削除する必要がありました。

于 2012-10-08T20:00:14.477 に答える