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

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

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

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

2回答

252閲覧

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

1750xkcm

総合スコア17

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

2クリップ

投稿2018/04/18 14:12

前提・実現したいこと

使用言語は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の勉強をはじめたばかりの初心者のためよく分かりません。
どなたかご教授いただけないでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ruby

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

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

ruby

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

という時、簡単なのは

erb

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

追記

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

の場合は普通に

ruby

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

でいいんじゃない?

投稿2018/04/19 07:52

編集2018/04/19 14:10
asm

総合スコア15147

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

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

1750xkcm

2018/04/19 13: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 上記エラーの解除方法がわかりましたら教えてください。
1750xkcm

2018/04/20 11: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 もし解決方法がわかりましたら教えてください。
asm

2018/04/20 13:36

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

2018/04/21 13:10

おっしゃるとおりでした! ◆ 修正箇所 <%= @material.each do |params| %> <% @material.each do |params| %> とても勉強になりました、ありがとうございました。
guest

0

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

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

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

◆ビュー

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

投稿2018/04/18 15:01

version1_2017

総合スコア160

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

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

1750xkcm

2018/04/19 12:36 編集

下記のように表示させたい場合はどのように記述すればよろしいでしょうか? ※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>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問