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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

2回答

847閲覧

Rails modelに定義したメソッドが認識されない件

nobita

総合スコア66

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/01/22 12:01

お世話になっております。

現在Railsの勉強を パーフェクト RubyonRailsという書籍を使って勉強をしております。
その書籍を勉強中にどうしてもうまくいかない部分があったので、質問させてください。
ページ数でいうと、 6章の320ページで、イベントシステムの詳細ページにイベントを作ったユーザーがアクセスした際に編集ボタンを表示するという部分になります。

[システム概要]
ユーザーが イベント情報を投稿できるシステム

モデルのコード下記に、created_by?のメソッドを作成しました。

event.rb

1class Event < ApplicationRecord 2 belongs_to :owner, class_name: "User" 3 4 validates :name, length: {maximum: 50}, presence: true 5 validates :place, length: {maximum: 100}, presence: true 6 validates :content, length: {maximum: 2000}, presence: true 7 validates :start_at, presence: true 8 validates :end_at, presence: true 9 validates :start_at_should_be_before_end_at 10 11 12 def created_by?(user) 13 return false unless user 14 15 owner_id == user.id 16 end 17 18 private 19 def start_at_should_be_before_end_at 20 return unless start_at && end_at 21 22 if start_at >= end_at 23 errors.add(:start_at, "は終了時間よりも前に設定してください") 24 end 25 end 26end 27

events/show.html.haml

1%h1.mt-3.mb-3= @event.name 2.row 3 .col-8 4 .card.mb-2 5 %h5.card-header イベント内容 6 .card-body 7 %p.card-text= @event.content 8 .card.mb-2 9 %h5.card-header 開催時間 10 .card-body 11 %p.card-text= "#{l(@event.start_at, format: :long)} - #{l(@event.end_at, format: :long)}" 12 .card.mb-2 13 %h5.card-header 開催場所 14 .card-body 15 %p.card-text= @event.place 16 .card.mb-2 17 %h5.card-header 主催者 18 .card-body 19 = link_to("https://github.com/#{@event.owner.name}", class: "card-link") do 20 = image_tag @event.owner.image_url, width: 50, height: 50 21 = "@#{@event.owner.name}" 22 .col-4 23 - if @event.created_by?(current_user) < --------- ここでevent.rbで定義したメソッドを使いたい. 24 = link_to("イベントを編集する", edit_event_path(@event), class: "btn btn-info btn-lg btn-block") 25 26 -# - if @event.owner.id == current_user.id 27 = link_to("イベントを編集する", edit_event_path(@event), class: "btn btn-info btn-lg btn-block") 28

上記のコードで bin/rails s をして、作成したイベントの詳細にアクセスすると、

NoMethodError in Events#show
となり、

イメージ説明

といったエラーになってしまいます.

[ためしたこと]
dbを一度作り直したり..してみたのですが、ダメでした。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

載せてあるcodeが実行時のもので、エラーもそのままであるとすると不可思議な症状です。
エラーメッセージから、 @event は Event のインスタンスであることはわかりますし、
viewのそれまでのcodeでエラーが出ないということもそれを裏付けます
とすると、、、、
可能性の一つは、Railsが created_by? をcreated_by? として認識していない。。。
Event.instance_methods として created_by? があるか見てください

投稿2022/01/22 14:11

winterboum

総合スコア23329

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

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

nobita

2022/01/23 12:23

ありがとうございます。 created_by?がないような気がしてます.. その他は何を確認すればよいのでしょうか...
winterboum

2022/01/23 21:02

codeに書かれている created_by? が他の名前で認識されていないか、じっくり見てください。 漢字変換モードになっていないことを確認して、今のcodeの 下 に もう一つ同じのを手入力して、試してください
nobita

2022/01/24 10:45

同じように実装してもダメみたいですね...orz 何が原因なのでしょうか。。 @event.methods で一覧を見ても一覧にはないですね。。
guest

0

そのエラーが出るときに@eventには何が入っているかデバッグしましたか?

投稿2022/01/22 12:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nobita

2022/01/23 12:22

ありがとうございます。 @eventには、しっかりと、イベントのデータが入っております.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問