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

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

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

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

Ruby on Rails 6

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

Q&A

解決済

2回答

332閲覧

Rubyでshuffleメソッドを使用してimageをランダムに表示する方法

shota_-.091321

総合スコア9

Ruby

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

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/10/07 06:15

前提

初学者でオリジナルアプリを作成しています。拙い質問ですが、知見をお借りできれば幸いです。

実現したいこと

データベースに保存したトランプの画像53枚をビューファイルでシャッフルした結果を表示したい

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

エラーは出ていないが、表示されている画像の一覧が投稿順のままで、シャッフルされていない

該当のソースコード

Ruby

1 <% @librarys.each do |libra| %> 2 <% libras = Array.new %> 3 <% libras.push(libra.image) %> 4 <% libras.shuffle %> 5 <%= image_tag libras.sample, class: "show-image" %> 6 <% end %>

試したこと

インスタンス変数@librarysを最初に下記のコードで記述し、シャッフルしてみましたが、結果は変わりませんでした。また、shuffleについて調査してみましたが知見を得られず質問をさせていただくことにしました。

Ruby

1 <% @librarys.shuffle %> 2 <% @librarys.each do |libra| %> 3 <% libras = Array.new %> 4 <% libras.push(libra.image) %> 5 <% libras.shuffle %> 6 <%= image_tag libras.sample, class: "show-image" %> 7 <% end %>

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

データベースには、順番通りに投稿したトランプの画像データ53枚が保存されている状態です。
コントローラーのコードも記述します。

Ruby

1 2class LibrarysController < ApplicationController 3 before_action :library_set, except: [:index, :new, :create] 4 5 def index 6 @librarys = Library.order("created_at DESC") 7 end 8 9 def new 10 @library = Library.new 11 end 12 13 def create 14 @library = Library.new(library_params) 15 if @library.save 16 redirect_to root_path 17 else 18 render :new 19 end 20 end 21 22 def show 23 end 24 25 def edit 26 end 27 28 def update 29 if @library.update(library_params) 30 redirect_to library_path 31 else 32 render :edit 33 end 34 end 35 36 def destroy 37 if user_signed_in? && current_user.id == @library.user_id 38 @library.destroy 39 redirect_to root_path 40 else 41 redirect_to root_path 42 end 43 end 44 45 private 46 def library_params 47 params.require(:library).permit(:card_type, :image, :numbers).merge(user_id: current_user.id) 48 end 49 50 def library_set 51 @library = Library.find(params[:id]) 52 end 53 54end

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

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

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

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

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

melian

2022/10/07 06:34

破壊的操作である array.shuffle! を使うとよいかと。
shota_-.091321

2022/10/07 07:15

気づかずにすいませんでした。ご回答いただきありがとうございました。
guest

回答2

0

ベストアンサー

shuffleメソッドは、オブジェクト(レシーバー)を書き換えないので、返り値を代入する必要があります。
libras = libras.shuffle

あるいは、レシーバーを書き換えるshuffle!メソッドを使うか。
libras.shuffle!

投稿2022/10/07 06:50

otn

総合スコア84423

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

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

shota_-.091321

2022/10/07 07:14

まだ別の問題で表示はできておりませんが、回答を早く頂けた方をベストアンサーとさせて頂きました。 shuffleメソッドのレシーバーの関係は全く考えていませんでした。 ご回答ありがとうございました。
otn

2022/10/07 12:10

a + 1 と書いても、a が1増えないのと同じです。
guest

0

また、shuffleについて調査してみましたが知見を得られず

shuffleはシャッフルした新しい配列を返すメソッドです。もとの配列は変化しません(るりま)。

結果を変数に受け取るか、あるいは破壊的にシャッフルを行うshuffle!を使うかをする必要があります。

投稿2022/10/07 06:50

maisumakun

総合スコア145123

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

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

shota_-.091321

2022/10/07 07:15

ご回答いただきありがとうございました、まだ表示はできておりませんが、新しい問題に取り組めそうです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問