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

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

ただいまの
回答率

90.83%

  • Ruby

    6762questions

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

  • Ruby on Rails

    6548questions

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

  • Ruby on Rails 5

    1101questions

データベースに登録したハッシュデータをeach構文で出力したい。

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 111

1750xkcm

score 4

 前提・実現したいこと

使用言語はRubyです。
データベースに登録したハッシュデータ「@material」をeach構文で下記のように出力したい。

ほげほげ1 ふがふが1
ほげほげ2 ふがふが2

 該当のソースコード

◆フォーム

<input name="material[hoge][]">
<input name="material[fuga][]">

◆コントローラー

def show
@material = @post.material
end

def create
@post = Post.new(
material: params[:material]
)
end

◆ビュー

<ul>
<% @material.each do |key, val| %>
<li><%= val %></li>
<% end %>
</ul>

これでは出力結果が下記のようになってしまいます。

["ほげほげ1", "ほげほげ2"]
["ふがふが1", "ふがふが2"]

 試したこと

下記ように記述すると意図するイメージ通りに出力されますが、
繰り返し処理ではありません。

<dl>
<dt><%= @material["hoge"][0] %><dt><dd><%= @material["huga"][0] %></dd>
<dt><%= @material["hoge"][1] %><td><dd><%= @material["huga"][1] %></dd>
</dl>

railsの勉強をはじめたばかりの初心者のためよく分かりません。
どなたかご教授いただけないでしょうか。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

mat = [{ hoge: "ほげ1", fuga: "ふが1"},
       { hoge: "ほげ2", fuga: "ふが2"}]


みたいな形式にすると普通にeach回せて楽ですね

mat = { "hoge" => %w[hogehoge1 hogehoge2], "fuga" => %w[fugafuga1 fugafuga2] }


という時、簡単なのは

% mat["hoge"].zip(mat["fuga"]).each{|hoge, fuga|
  <dt><%= hoge %></dt><dd><%= fuga %></dd>
% }
</dl>

追記

[<ActionController::Parameters {"hoge"=>"ほげほげ1", "fuga"=>"ふがふが1"} permitted: false>,
<ActionController::Parameters {"hoge"=>"ほげほげ2", "fuga"=>"ふがふが2"} permitted: false>]


の場合は普通に

% @material.each{|param|
    <dt><%= param["hoge"] %></dt><dd><%= param["fuga"] %></dd>
% }

でいいんじゃない?

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/19 22:34

    フォームは下記のように修正しました。

    ◆ HTML

    <input name="material[][hoge]">
    <input name="material[][fuga]">

    データベースにsaveしたデータを「<%= @material %>」で出力してみたところ下記のように表示されました。

    [<ActionController::Parameters {"hoge"=>"ほげほげ1", "fuga"=>"ふがふが1"} permitted: false>,
    <ActionController::Parameters {"hoge"=>"ほげほげ2", "fuga"=>"ふがふが2"} permitted: false>]


    そしてビューを下記のように修正しました。

    ◆ ビュー

    <dl>
    <% @material["hoge"].zip(@material["fuga"]).each do |hoge, fuga| %>
    <dt><%= hoge %></dt><dd><%= fuga %></dd>
    <% end %>
    </dl>


    としましたら。。。下記のようなエラー文が表示されました。

    no implicit conversion of String into Integer



    上記エラーの解除方法がわかりましたら教えてください。

    キャンセル

  • 2018/04/20 20:36

    意図するように表示されました!ありがとうございます。
    ですが…下記も表示されたままです。

    [<ActionController::Parameters {"hoge"=>"ほげほげ1", "fuga"=>"ふがふが1"} permitted: false>,
    <ActionController::Parameters {"hoge"=>"ほげほげ2", "fuga"=>"ふがふが2"} permitted: false>]

    マイグレーションファイルかクラスファイルあたりが悪さをしているように思うのですが。。。

    ◆マイグレーションファイル
    def change
     add_column :posts, :material, :text, array: true
    end

    ◆クラスファイル
    serialize :material

    もし解決方法がわかりましたら教えてください。

    キャンセル

  • 2018/04/20 22:36

    ブラウザに表示されるとしたら<% %> とすべき所を <%= %> にした時等に見られる症状ですね

    キャンセル

  • 2018/04/21 22:10

    おっしゃるとおりでした!

    ◆ 修正箇所
    <%= @material.each do |params| %>
    <% @material.each do |params| %>

    とても勉強になりました、ありがとうございました。

    キャンセル

0

ちょっと全貌が見えないのでなんとも言えないのですが、頂いた情報から察するにフォームの形が違うのかなと思います。

やりたいことを察するにフォームとビューの形はこのようになるのではないでしょうか?
◆フォーム

<input name="material[hoge]">
<input name="material[fuga]">

◆ビュー

<ul>
<% @material.each do |key, val| %>
<li><%= key %>:<%= val %></li>
<% end %>
</ul>

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/04/19 16:32 編集

    下記のように表示させたい場合はどのように記述すればよろしいでしょうか?
    ※hogeにfugaを紐づけて表示させる

    ■ ブラウザー出力

    ----------------------
    hoge1 fuga1
    ----------------------
    hoge2 fuga2
    ----------------------

    ■ ハッシュの中身
    @material = {"hoge"=>["ほげほげ1", "ほげほげ2"], "fuga"=>["ふがふが1", "ふがふが2"]}


    下記のよう書くと上記のブラウザー出力の例のように表示されるのですが、
    繰り返し処理ではないため、できればこれをeachなどで出力できるようしたいです。

    <dl>
    <dt><%= @material["hoge"][0] %><dt><dd><%= @material["huga"][0] %></dd>
    <dt><%= @material["hoge"][1] %><td><dd><%= @material["huga"][1] %></dd>
    </dl>

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Ruby

    6762questions

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

  • Ruby on Rails

    6548questions

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

  • Ruby on Rails 5

    1101questions