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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

2621閲覧

多対多の関連づけにおけるuninitialized constant Object::Somethingエラー

s.k

総合スコア423

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/12/26 06:35

編集2016/12/26 06:44

youtubeのような「後で見る」機能を多対多の関連づけを行おうとしています。

###前提・実現したいこと
多対多の関連づけを実装したいです。

###エラー内容

NameError in Microposts#show uninitialized constant Micropost::Safe #クリップしているかどうかを、返すメソッド def saved_by? user saves.where(user_id: user.id).exists?←★エラー箇所★ end

同様の機能を別名で実装済みですので、
書き損じかなと考え、見直したのですが見当たりませんでした。

またエラー内容でSafeというモデルは存在しないのでここが原因であるかと思ったのですが、さがしだせませんでした。。。

私が用意したモデルはSaveです。

###実行手順

①中間テーブル作成
②中間テーブルにインデックスを追加
③データベース作成
④能動的関係について多対多の関連づけ
⑤中間テーブルについて多対多の関連づけ
⑥受動的関係について多対多の関連づけ
⑦受動的関係について能動的データの存在チェックメソッド作成
⑧ルーティング設定
⑨中間モデルのコントローラーを作成
⑩コントローラーにメソッド作成
⑪ajaxファイル、リンクファイルを作成
⑫リンクを表示
⑬users_controllerにメソッド追加

###ソース

【micropost.rb】

has_many :saves, dependent: :destroy

【user.rb】

has_many :saves, dependent: :destroy

【save.rb】

belongs_to :user belongs_to :micropost validates :user, presence: true validates :user_id, uniqueness: { scope: :micropost_id } validates :micropost, presence: true

【_save_links.html.erb】

<% if micropost.saved_by? current_user %>←★micropost.rbへ★ <%= link_to "クリップ(User-to-Shop)をやめる", micropost_saves_path(micropost.id), method: :delete, :id => "saves_ajax_#{micropost.id}", remote: true %> <% else %> <%= link_to "クリップ(User-to-Shop)", micropost_saves_path(micropost.id), method: :post, :id => "saves_ajax_#{micropost.id}", remote: true %> <% end %>

【micropost.rb】

def saved_by? user saves.where(user_id: user.id).exists?←★エラー箇所★ end

###ログ

ActionView::Template::Error (uninitialized constant Micropost::Safe): 1: <% if micropost.saved_by? current_user %> 2: <%= link_to "クリップ(User-to-Shop)をやめる", micropost_saves_path(micropost.id), method: :delete, :id => "saves_ajax_#{micropost.id}", remote: true %> 3: <% else %> 4: <%= link_to "クリップ(User-to-Shop)", micropost_saves_path(micropost.id), method: :post, :id => "saves_ajax_#{micropost.id}", remote: true %> app/models/micropost.rb:98:in `saved_by?' app/views/saves/_save_links.html.erb:1:in `_app_views_saves__save_links_html_erb__1116921635009128905_54780520' app/helpers/users_helper.rb:75:in `user_saves' app/views/microposts/_link.html.erb:10:in `_app_views_microposts__link_html_erb___1313612887524713522_49694880' app/views/microposts/show.html.erb:31:in `_app_views_microposts_show_html_erb__172594646965366599_53457720'

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーメッセージ「uninitialized constant Micropost::Safe」は
「Micropostクラスの、Safeという定数は、初期化されていませんよ」という意味です。

定数(Rubyは、大文字(A~Z)で始めると定数だとして扱います)を初期化していないのに、その定数の値を使おうとすると、上記のエラーになります。

Micropostクラスのコードの中から"Safe"という文字列を探して下さい。
そして、Safeに初期値を与えてください。 Safe = 1 のように値を代入する事で、初期化されます。

投稿2016/12/26 09:32

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

s.k

2016/12/26 09:46

ありがとうございます! ご指摘どおりでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問