質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

railsのいいね機能実装時のUnknownAttributeError

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 90

garta

score 9

railsを学習しており、Qiita記事を参考にいいね機能を実装しようとしていたところ、

unknown attribute 'micropost_id' for Like.


というエラーメッセージが表示されてしまいます。
micropost_idというカラムはどのテーブルにも存在していませんし、
同名の値をどこかで渡しているわけでもありません。
調べてみたところ、shemaとmysql自体のの齟齬に関する記事がいくつか出てきたので、
mysqlからlikesテーブルのカラムを確認したところshemaと一致。
そのほか、
rails db:reset
rails db:migrate:reset
を実行しましたが変わらずエラーになります。
お手上げ状態で、どなたかアドバイスお願いいたします。

スキーマ(likeテーブル)

  create_table "likes", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci", force: :cascade do |t|
    t.integer "user_id"
    t.integer "like_id"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false
    t.index ["like_id"], name: "index_likes_on_like_id"
    t.index ["user_id", "like_id"], name: "index_likes_on_user_id_and_like_id", unique: true
    t.index ["user_id"], name: "index_likes_on_user_id"
  end

いいねボタンのパーシャル

<% if current_user!=post.user %>
    <span class="like">
    <% if post.like?(current_user) %>
      <%= form_for(post.likes.find_by(user_id: current_user.id), method: :delete, remote: true) do |f| %>
        <%= button_tag(class: "btn btn-default btn-xs") do %>
          <%= content_tag :span, "#", class: "glyphicon glyphicon-heart" %>
        <% end %>
      <% end %>
    <% else %>
      <%= form_for(post.likes.build, remote: true) do |f| %>
        <div><%= hidden_field_tag :like_id, post.id %></div>
        <%= button_tag(class: "btn btn-default btn-xs") do %>
          <%= content_tag :span, "#", class: "glyphicon glyphicon-heart-empty" %>
        <% end %>
      <% end %>
    <% end %>
  </span>
<% end %>

like.rb

class Like < ApplicationRecord
    belongs_to :user
    belongs_to :micropost
    validates :user_id, presence: true
    validates :like_id, presence: true
end

user.rb

class User < ApplicationRecord
  has_many :microposts,dependent: :destroy
  has_many :active_relationships, class_name:  "Relationship",
                                  foreign_key: "follower_id",
                                  dependent:   :destroy
  has_many :passive_relationships, class_name:  "Relationship",
                                  foreign_key: "followed_id",
                                  dependent:   :destroy
  has_many :following, through: :active_relationships, source: :followed
  has_many :followers, through: :passive_relationships
  has_many :likes, dependent: :destroy

  validates :name,presence: :true, length:{ maximum: 15 }
  validates :email,presence: :true
  validates :password, presence:true,length:{ minimum: 6 }
  validates :password_confirmation,presence: :true

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  mount_uploader :avatar, AvatarUploader

micropost.rb

  belongs_to :user
  has_many :likes, dependent: :destroy
  has_many :like_users, through: :likes, source: :user
  default_scope -> { order(created_at: :desc) }
  mount_uploader :picture, PictureUploader
  validates :user_id,presence: true
  validates :title,  presence: true
  validates :content,length: { maximum: 140 }
  validates :picture, presence: true

relationship.rb

class Relationship < ApplicationRecord
    belongs_to :follower,   class_name: "User"
    belongs_to :followed,   class_name: "User"

    validates  :follower_id,presence: true
    validates  :followed_id,presence: true
end
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • winterboum

    2019/12/01 19:59

    モデルが4つ有るのかな、それらの関連定義のところを見せて下さい。
    belongs_to とか has_* とかのことです

    キャンセル

  • garta

    2019/12/02 09:27

    追記させていただきました、
    どうぞよろしくお願いいたします。

    キャンセル

回答 1

checkベストアンサー

+1

class Like に belongs_to :micropost という宣言があります。
ということは class Like に micropost_id がなければならないのですが、他の名前になったりしていませんか?

validates :user_id, presence: true
validates :like_id, presence: true

とあるので、micropost, like, like_user がごちゃごちゃになっているような。
そういえば、 Like にLike_id はおかしいし。

スキーマの見直しが必要かも

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/03 10:33

    おっしゃる通り,関連付がごちゃごちゃになっていたようで、
    修正したところ無事機能を実装できました。
    非常に助かったと同時に、今一度学習しなおす必要があると気づけたので、
    本当に感謝します。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる