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

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

ただいまの
回答率

90.52%

  • Ruby

    9191questions

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

  • Ruby on Rails

    8603questions

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

  • Ruby on Rails 4

    2534questions

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

Ruby ループ処理について

解決済

回答 6

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 600

NishidaRyu416_

score 83

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

要件

配列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にあたるものがはいっているのですが
エラーが出ます

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 6

check解決した方法

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
編集したところ上記のエラーです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

array1 = [1,2,3,4]
array2 = [1,2,3,4,5,6,7,8,9,10,11,12] 

values = array2.each_slice(4).to_a

hash = {}
array1.each_with_index do |num, i|
  hash[num] = values[i]
end

hash
# => {1=>[1, 2, 3, 4], 2=>[5, 6, 7, 8], 3=>[9, 10, 11, 12], 4=>nil}

でいかがでしょう?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/30 17:37

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

    キャンセル

  • 2017/01/30 17:43 編集

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

    キャンセル

  • 2017/01/30 17:45

    両方ともインスタンスです

    キャンセル

  • 2017/01/30 17:48

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

    キャンセル

  • 2017/01/30 17:49

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

    キャンセル

  • 2017/01/30 18: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にはいれつににあたるものがはいっているのですが
    エラーが出ます

    キャンセル

  • キャンセル

  • 2017/01/30 18: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|%>
    じゃないかと。

    キャンセル

  • 2017/01/30 19: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
    編集したところ上記のエラーです

    キャンセル

  • 2017/01/31 11:42

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

    キャンセル

0

foo = [1,2,3,4]
bar = [1,2,3,4,5,6,7,8,9,10,11,12]

foo.zip(bar.each_slice(4)).each do |fo, ba|
  break unless ba # ←必要に応じて
  puts "#{fo}:#{ba.inspect}"
end

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

foo = [1,2,3,4]
bar = [1,2,3,4,5,6,7,8,9,10,11,12]

p foo.zip(bar.each_slice(4)).each_with_object({}){|(k,v),o| o[k]=v}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

splited = arr2.each_slice(4).to_a

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

irb で操作しています。

$ irb
irb(main):001:0> questions = %w(問題1 問題2 問題3)

=> ["問題1", "問題2", "問題3"]
irb(main):002:0> choices = %w(選択01 選択02 選択03 選択04 選択05 選択06 選択07 選択08 選択09 選択10 選択11 選択12)
=> ["選択01", "選択02", "選択03", "選択04", "選択05", "選択06", "選択07", "選択08", "選択09", "選択10", "選択11", "選択12"]

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Ruby

    9191questions

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

  • Ruby on Rails

    8603questions

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

  • Ruby on Rails 4

    2534questions

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