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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

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

Q&A

解決済

6回答

1656閲覧

Ruby ループ処理について

NishidaRyu416_

総合スコア113

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2017/01/30 08:18

編集2017/01/30 09:51

##ループ処理についての質問です回答よろしくお願いします。

##要件
配列1:[1,2,3,4]
配列2:[1,2,3,4,5,6,7,8,9,10,11,12]
のような二つの配列があります。
この配列を、ループで配列1を処理するたびに、
配列2の数字を4つずつ配列1に持たせるというような処理がしたいのです。

1:1,2,3,4
2:5,6,7,8
3:9,10,11,12
##試したこと
each,groups_ofなどのメソット

##補足

実際には数字の部分がすべてインスタンスです。
説明のために上では数字にしてあります。
目的としては

クイズで
一問あたりに回答候補として4つでてくるみたいな感じです。

両方ともインスタンスである必要があるのはインスタンスをrailsのhidden _fieldで送信するからです。

##実際のコード

<%= form_tag(action: :create) do %> <%= hidden_field_tag "count", @words.count %> <%@words.each.with_index(1) do|word,n|%> <%if params['test_option'] == "練習"%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%> (正答: <%= eval("word.#{@answer}") %>)</label><br> <%else%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%></label><br> <%end%> <label><%= "#{n}"%>:<%=word.answer%><%=radio_button_tag "#{n}",word.answer%></label><br> <%= hidden_field_tag "answer#{n}", eval("word.#{@answer}") %> <table> <%values = @value.each_slice(4).to_a%> <tr> <%values.each_with_index do |value, i|%> <td><label><%= "#{i}"%><%="fe"%><%=radio_button_tag "#{i}",value.answer%></label><br><br></td> <%#value. = values[i]%> <%end%> </tr> </table> <%end%> <%= submit_tag "Answer", class: "btn btn-large btn-primary" %> <% end %>

こんな感じで、@wordsに配列1にあたるものが入っていて、@valueには、配列2にあたるものがはいっているのですが
エラーが出ます

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

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

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

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

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

guest

回答6

0

皆さん、回答ありがとうございました。
インスタンス変数を、ループ内で増やしていくことによって、解決しました。

投稿2017/01/31 13:06

NishidaRyu416_

総合スコア113

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

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

0

irb で操作しています。

riby

1$ irb 2irb(main):001:0> questions = %w(問題1 問題2 問題3) 3 4=> ["問題1", "問題2", "問題3"] 5irb(main):002:0> choices = %w(選択01 選択02 選択03 選択04 選択05 選択06 選択07 選択08 選択09 選択10 選択11 選択12) 6=> ["選択01", "選択02", "選択03", "選択04", "選択05", "選択06", "選択07", "選択08", "選択09", "選択10", "選択11", "選択12"] 7 8irb(main):003:0> questions.map { |q| [q, choices.shift(4)] } 9=> [["問題1", ["選択01", "選択02", "選択03", "選択04"]], ["問題2", ["選択05", "選択06", "選択07", "選択08"]], ["問題3", ["選択09", "選択10", "選択11", "選択12"]]]

["問題1", ["選択01", "選択02", "選択03", "選択04"]] のように
問題 1つに対して、選択肢が 4 つある という配列を作り出しています。
それらをさらに配列にしてまとめています。

投稿2017/01/30 14:32

katoy

総合スコア22324

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

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

0

自己解決

<%= form_tag(action: :create) do %> <%= hidden_field_tag "count", @words.count %> <table> <%values = @value.each_slice(4).to_a%> <tr> <%@words.each.with_index(1) do |word, n|%> <%if params['test_option'] == "練習"%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%> (正答: <%= eval("word.#{@answer}") %>)</label><br> <%else%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%></label><br> <%end%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%></label><br> <label><%= "#{n}"%>:<%=word.answer%><%=radio_button_tag "#{n}",word.answer%></label><br> <%= hidden_field_tag "answer#{n}", eval("word.#{@answer}") %> <%values[n].each.with_index do |value, i|%> <%value.answer = values[i]%> <td><label><%= "#{i}"%><%=value.answer%><%=radio_button_tag "#{i}",value.answer%></label><br><br></td> <%end%> <%end%> </tr> </table> <%= submit_tag "Answer", class: "btn btn-large btn-primary" %> <%end%>

https://gyazo.com/d8cefa33ebdffb0eaf033d390781725b
編集したところ上記のエラーです

投稿2017/01/30 10:09

NishidaRyu416_

総合スコア113

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

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

0

どのようなことがしたいか見えてこない部分はありますが、配列2を「4つずつ」に区切ることは簡単にできます。

ruby

1splited = arr2.each_slice(4).to_a

あとは配列1と合わせてHashを作るなり何なりできます。

投稿2017/01/30 08:42

maisumakun

総合スコア145183

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

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

0

Ruby

1foo = [1,2,3,4] 2bar = [1,2,3,4,5,6,7,8,9,10,11,12] 3 4foo.zip(bar.each_slice(4)).each do |fo, ba| 5 break unless ba # ←必要に応じて 6 puts "#{fo}:#{ba.inspect}" 7end

ハッシュにしたいということであれば、[4]=nilまで含まれちゃうことに目をつぶれば、

Ruby

1foo = [1,2,3,4] 2bar = [1,2,3,4,5,6,7,8,9,10,11,12] 3 4p foo.zip(bar.each_slice(4)).each_with_object({}){|(k,v),o| o[k]=v}

投稿2017/01/30 08:37

編集2017/01/30 08:45
otn

総合スコア84538

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

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

0

配列1に対して、配列2の要素を順番に持たせるんであれば

ruby

1array1 = [1,2,3,4] 2array2 = [1,2,3,4,5,6,7,8,9,10,11,12] 3 4values = array2.each_slice(4).to_a 5 6hash = {} 7array1.each_with_index do |num, i| 8 hash[num] = values[i] 9end 10 11hash 12# => {1=>[1, 2, 3, 4], 2=>[5, 6, 7, 8], 3=>[9, 10, 11, 12], 4=>nil}

でいかがでしょう?

投稿2017/01/30 08:28

satoshih

総合スコア797

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

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

NishidaRyu416_

2017/01/30 08:37

実際には、数字ではなくインスタンスなのですが、この処理でいけますか?
satoshih

2017/01/30 08:43 編集

どの部分がインスタンスですか? array1の要素がインスタンスで、そのインスタンスの持つインスタンス変数に入れたいのでしょうか?
satoshih

2017/01/30 08:48

それでしたらループの部分を array1.each_with_index do |ins, i| ins.values = values[i] end のように書き換えれば動くかと思います。(回答に書いたhashはいらなくなります)
satoshih

2017/01/30 08:49

ins.values のvaluesはメソッド名なので、実際に使うメソッドに書き換えてください。
NishidaRyu416_

2017/01/30 09:46

``` <%= form_tag(action: :create) do %> <%= hidden_field_tag "count", @words.count %> <%@words.each.with_index(1) do|word,n|%> <%if params['test_option'] == "練習"%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%> (正答: <%= eval("word.#{@answer}") %>)</label><br> <%else%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%></label><br> <%end%> <label><%= "#{n}"%>:<%=word.answer%><%=radio_button_tag "#{n}",word.answer%></label><br> <%= hidden_field_tag "answer#{n}", eval("word.#{@answer}") %> <table> <%values = @value.each_slice(4).to_a%> <tr> <%values.each_with_index do |value, i|%> <td><label><%= "#{i}"%><%="fe"%><%=radio_button_tag "#{i}",value.answer%></label><br><br></td> <%#value. = values[i]%> <%end%> </tr> </table> <%end%> <%= submit_tag "Answer", class: "btn btn-large btn-primary" %> <% end %> ``` こんな感じで、@wordsに配列一にあたるものが入っていて、@valueにはいれつににあたるものがはいっているのですが エラーが出ます
satoshih

2017/01/30 09:55

valuesは [[1, 2, 3, 4], [5, 6, 7, 8].... ] の形になっているので、 おそらくやりたいことは <%values.each_with_index do |value, i|%> ではなく <%values[n].each_with_index do |value, i|%> じゃないかと。
NishidaRyu416_

2017/01/30 10:11

<%= form_tag(action: :create) do %> <%= hidden_field_tag "count", @words.count %> <table> <%values = @value.each_slice(4).to_a%> <tr> <%@words.each.with_index(1) do |word, n|%> <%if params['test_option'] == "練習"%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%> (正答: <%= eval("word.#{@answer}") %>)</label><br> <%else%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%></label><br> <%end%> <label for=<%= "#{n}"%>><%= "#{n}問目"%>:<%= eval("word.#{@question}")%></label><br> <label><%= "#{n}"%>:<%=word.answer%><%=radio_button_tag "#{n}",word.answer%></label><br> <%= hidden_field_tag "answer#{n}", eval("word.#{@answer}") %> <%values[n].each.with_index do |value, i|%> <%value.answer = values[i]%> <td><label><%= "#{i}"%><%=value.answer%><%=radio_button_tag "#{i}",value.answer%></label><br><br></td> <%end%> <%end%> </tr> </table> <%= submit_tag "Answer", class: "btn btn-large btn-primary" %> <%end%> https://gyazo.com/d8cefa33ebdffb0eaf033d390781725b 編集したところ上記のエラーです
satoshih

2017/01/31 02:42

<%Array(values[n]).each_with_index do |value, i|%> なら動きますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問