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

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

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

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

1回答

1466閲覧

いいね機能の実装について

退会済みユーザー

退会済みユーザー

総合スコア0

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

Ruby on Rails

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/02/18 14:44

編集2022/01/12 10:55

errorを解決していいねボタンを表示させたいです

Hamlでいいね機能を組み込んだシステムを作っています。
いいね機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

NoMethodError in Halls#index Showing /Users/yuuka/projects/wedding-app/app/views/likes/_like.html.haml where line #2 raised: undefined method `like_user' for #<Hall::ActiveRecord_Relation:0x00007fd0d2843c80> Extracted source (around line #2): 1- if user_signed_in? 2 - if halls.likes_user(current_user.id)

該当のソースコード

ruby

1# app/models/hall.rb 2class Hall < ApplicationRecord 3 belongs_to :user 4 has_many :likes, dependent: :destroy 5 6 def like_user(user_id) 7 likes.find_by(user_id: user_id) 8 end 9end 10 11 12

haml

1# views/likes/_like.html.haml 2 3- if user_signed_in? 4 - if halls.like_user(current_user.id) 5 .hall__name__dislike 6 =link_to user_hall_like_path(current_user, hall, like), method: "DELETE", remote: true do 7 %i.fas.fa-heart 8 %span いいね! 9 %span 10 = h.likes_count 11 - else 12 .hall__name__like 13 =link_to user_hall_likes_path(current_user, hall), method: "POST", remote: true do 14 %i.fas.fa-heart 15 %span いいね! 16 %span 17 = h.likes_count 18-else 19 .hall__name__like 20 %i.fas.fa-heart 21 %span いいね! 22 %span 23 = h.like_count

ruby

1# halls_controller 2 3class HallsController < ApplicationController 4 def index 5 @halls = Hall.all 6 end 7 8end

haml

1 2# views/halls/index.html.haml 3 4hall 5 - if @halls.present? 6 - @halls.each do |h| 7 .hall__name 8 = h.name 9 = render partial: 'likes/like', locals: { halls: @halls, likes: @likes, like: @like} 10 .hall__image 11 = image_tag h.image 12 .hall__place 13 = h.place 14 .hall__link 15 = link_to top_page_index_path(current_user.id) do 16 詳細をみる
# controller/likes_controller class LikesController < ApplicationController def create @like = Like.create(user_id: current_user.id, hall_id: params[:hall_id]) @likes = Like.where(hall_id: params[:hall_id]) get_hall end def destroy @like = Like.find_by(user_id: current_user.id, hall_id: params[:hall_id]) @like.destroy @likes = Like.where(hall_id: params[:hall_id]) get_hall end def get_hall @hall = Hall.find(params[:hall_id]) end end

試したこと

  • if halls.like_user(current_user.id)

hallsの中には@halls.each do |h|の情報が入っており、
current_user.idも情報が入っていますがエラーが起きます
like_userのなかに情報が入ってくれないのではないか?

補足情報(FW/ツールのバージョンなど)

このサイトを真似してみました
https://qiita.com/haruya_hamasaki/items/75d41a1aafb87408737d

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

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

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

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

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

aiandrox

2020/02/18 15:45

views/likes/_like.html.hamlを読み込んでいる元のビューファイルと、halls_controllerのファイルを見せていただきたいです。
退会済みユーザー

退会済みユーザー

2020/02/19 01:48

修正しました。
guest

回答1

0

undefined method like_user' for #<Hall::ActiveRecord_Relation..`
となっています。
おそらく controller で where で絞り込むか all でとり込むかした値がそのまま view の hall に渡っているのだと思います。(ActiveRecord_Relationとなってる)
find_by で取るか、もしくは first(一つしか無いか、最初ので良いかなら)してHallのインスタンスにしてください

追記
indexであるなら、複数ですから

# CONTROLLER def index @halls = Hall.all # params[:id]があるんですか?このidは何のid? それに応じたwhereにする end # views/halls/index.html.haml .hall - if @halls.present? - @halls.each do |h|

で問題は likes/like です。
locals: { hall: @hall, halls: @halls, likes: @likes, like: @like}
と沢山渡してますがこの中で定議されているのはひとつだけ。
このpartialはindexの中で何回呼ばれるのでしょうか?
index.htmlを見た限りでは一回だけです。すると沢山ある hall のそれぞれに沢山あるlikeのどれをdeleteするのですか?

投稿2020/02/18 20:46

編集2020/02/19 03:15
winterboum

総合スコア23284

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

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

退会済みユーザー

退会済みユーザー

2020/02/19 01:54 編集

回答いただきありがとうございます。 find_byで取り込んで見た所 views/halls/index.html.hamlのeachでエラーが出たので- if @hall.present?としてみたのですが for nil:NilClassと表示されてしまいます。- if @hall.present?と言うコードがおかしいでしょうか? 度々、すいません。
winterboum

2020/02/19 03:01

indexだったんだ、すると複数個ある可能性があるのですから、@halls と複数形にしてください。文法的には間違いではないですが、人間が読むと一つのHallを表していると勘違いして、私の回答の様になってしまいます。 回答に追記します
退会済みユーザー

退会済みユーザー

2020/02/19 04:04

@hallsに変更しました。 nil エラーに変わりました。 一番下にlikes_controllerファイルを追加しました。 こちらの変数を渡そうとしています。
winterboum

2020/02/19 04:53

そのnilエラーのメッセージ載せてください。 どこでなにがnilかわからないと何もわからんです それと回答に追記してありますが、最後の所読みました?
退会済みユーザー

退会済みユーザー

2020/02/19 05:29

修正しました。 読みました。一回だけです。 初心者で質問の理解がきちんとできず申し訳ないです。
winterboum

2020/02/19 05:31

1つだけとすると、 どのhallのどのlikeを対象とするのでしょう???
退会済みユーザー

退会済みユーザー

2020/02/19 06:22

index.html.hamlの.hallの情報を対象としています。 この答えであってますでしょうか
winterboum

2020/02/19 08:05

ぜんぜん。 indexでは複数のhallがありますよね? そのどれを対象にするのでしょう
退会済みユーザー

退会済みユーザー

2020/02/19 08:27

views/halls/index.html.hamlの.hallに作られた情報に対していいねをつけたいので このhallの一つずつにつけたいです。 複数あるホール情報全てに一つずつつけたいです。
winterboum

2020/02/19 10:29

それを一つの「%span いいね!」でやるということは、一回押すと全部にいいねが着くのですか?
退会済みユーザー

退会済みユーザー

2020/02/19 14:53

つきません。イメージはtweeterのようなツイートがhallでその一つに対していいねするようにしたいです。 views/halls/index.html.hamlの.hallがそのツイートの部分にあたります
winterboum

2020/02/19 19:31

すると、いいねが着くのはどのhallですか?
退会済みユーザー

退会済みユーザー

2020/02/19 23:47

views/halls/index.html.hamlファイルのこの部分です .hall - if @hall.present? - @hall.each do |h| .hall__name = h.name .hall__image = image_tag h.image .hall__place = h.place .hall__link = link_to top_page_index_path(current_user.id) do 詳細をみる
winterboum

2020/02/20 00:11

@hall.each ってあるように複数です。 この中のどのhollを対象にするのか、を聞いてます
退会済みユーザー

退会済みユーザー

2020/02/20 02:13

この全部を対象にしたいですが、 絞るのであれば.hall__nameのみにつけることができれば嬉しいです。
winterboum

2020/02/20 03:03

全部を対象にするなら、一つ一つに render partial: 'likes/like', をつける必要があります
退会済みユーザー

退会済みユーザー

2020/02/20 05:46

nameのみを対象にするのであればnameにつければよいということですよね? やってみます!!
winterboum

2020/02/20 06:18

なんか話が通じない。 このテーマをやるのはまだむずかしいのでは。 ruby、rails、object指向をもう少し勉強してみてください。 チュートリアルとかはやりましたか?
退会済みユーザー

退会済みユーザー

2020/02/21 12:30

nameを対象にするのは難しいですか? チュートリアルはしてません。勉強しようと思います。 エラー文を修正するのでみていただけますか?
winterboum

2020/02/21 13:02

エラー文は修正しないでそのまま載せるようにしてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問