🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

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

Q&A

解決済

2回答

1315閲覧

いいね機能のRspec いいね数を取得する方法orアイコンをクリックで反映させる方法

Pro01x19

総合スコア17

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Ajax

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

0グッド

0クリップ

投稿2020/12/26 17:06

編集2020/12/27 00:10

前提・実現したいこと

始めまして、私は学習2ヶ月ちょっとのRails初学者です。
現在SNSのようなオリジナルアプリを開発しており、いいね機能のテストコードを書いている段階です。

私の現状が
イメージ説明
このような形でお気に入り登録の数がリンクになってしまっている物です。

開発段階では形に拘らず完成を目指していたのですが、
数字の部分を取得する方法が分からずテストコードが書けずにいます。

(私なりの)解決法の仮説

1 マークをリンクにしてお気に入りができるようにする

2 テストコードでいいね数を取得する

私としては1で開発し、見た目を整えつつ
下記の記事を参考にテストコードを書いていけたと思っております。

https://qiita.com/nanairo3/items/9efc86159582ae788f32

該当のソースコード

view/likes/_like.html.erb <% if user_signed_in? %> <% if post.like_user(current_user.id) %> <p><span>お気に入り解除: <i class="fas fa-star"><%=link_to post.likes.count, post_likes_path(post.id), method: :delete, remote: true %></i></span> </p> <% else %> <p>お気に入り登録: <span><i class="far fa-star"><%=link_to post.likes.count, post_likes_path(post.id), method: :post, remote: true %></i></span> </p> <% end %> <% else %> <i class="far fa-star"></i> <p><span>お気に入り数: </span><%= post.likes.count %></p> <% end %>
view/likes/create.js.erb & destroy/js.erb $('#likes_buttons_<%= @post.id %>').html("<%= j(render partial: 'likes/like', locals: {post: @post}) %>");
Likes_contoroller def create @post = Post.find(params[:post_id]) like = current_user.likes.build(post_id: params[:post_id]) like.save end def destroy @post = Post.find(params[:post_id]) like = Like.find_by(post_id: params[:post_id], user_id: current_user.id) like.destroy end end

試したこと

1の仮説で問題解決を取り組んだところ、星のマークが数字の左へ行ったり、右へ行ったり、またはエラーを出してしまったりして私が思った通りのものができませんでした。

2の仮説では
イメージ説明Xpath
このような要素をクリックしたいと思ったのですが、
こちらをどう活かしたら良いのか分からず、Xpathを使用した場合も

Failure/Error: find('/html/body/div/div/div/div[2]/p/span/i/a').click Selenium::WebDriver::Error::InvalidSelectorError: invalid selector: An invalid or illegal selector was specified (Session info: chrome=87.0.4280.88)

のようなエラーが出てしまい、解決が難しい状況です。

私としてはやはり、1の方法で解決したい。という気持ちが強いです。
しかし、勉強のため2の方法でも解決する方法を知りたいと考えております。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じだといかがでしょうか。

<%= link_to post_likes_path(post.id), remote:true, method: :delete do %> <i class="fas fa-star"></i> <% end %>

おそらく、link_toの中に post.likes.count を指定してしまっているので、いいねの数にリンクが振られている状態になってしまっているものだと思われます。

投稿2020/12/27 08:40

educ_gt

総合スコア282

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

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

Pro01x19

2020/12/27 08:50

できました! <span>お気に入り解除: <%= link_to post_likes_path(post.id), remote:true, method: :delete do %> <i class="fas fa-star"></i> <% end %> <%= post.likes.count %></span> このような形でlikes.countを外にだし、ブロックを使うことでfont-awesomeの要素も中に入れられました。 仮説立てと基礎を実戦で活かす思考力をもっと意識したいな、と感じる一見でした。 @educ_gtさん本当にありがとうございました!
guest

0

1 マークをリンクにしてお気に入りができるようにする
に関して、link_toでfont-awesomeの要素も囲ってしまえば良さそうです。

今、

<p><span>お気に入り解除: <i class="fas fa-star"><%=link_to post.likes.count, post_likes_path(post.id), method: :delete, remote: true %></i></span> </p>

というコードになっているため、iタグに指定してある、font-awesomeがリンクになっていないということが起きていそうです。

2 に関して、
いずれにおいても結合テストを書く場合は、上のlink_toにクラスを指定してやって、そのクラスをclick_onとかでクリックするようにしたらいいかなと思います。

1が出来たら2はすぐうまいこといくかなとおもいます。

投稿2020/12/27 07:04

educ_gt

総合スコア282

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

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

Pro01x19

2020/12/27 08:20

回答ありがとうございます! link_toでfont-awesomeの要素を囲う。について 1、link_toをaタグにして閉じタグを設けて囲えるようにする 2、直接iタグの要素をlink_toのなかに書き込む を試しました。 どちらもまだ工夫が足りないだけかもしれませんが、 1はリンクになってもらえず 2はエラーが出てしまう結果となりました。 ``` <%=link_to post.likes.count, post_likes_path(post.id), remote: true, method: :delete do %><i class="fas fa-star"></i> ``` このような形も試しましたが undefined method `stringify_keys' for "/posts/1/likes":String のようなエラーが出てきてしまいました。 もし、@educ_gtさんのご指摘いただいていた形ではなかったら申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問