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

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

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

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

2回答

838閲覧

[Rails]フォーム入力時のundefined method `each' for ...エラーについて

ts21

総合スコア32

Ruby

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Ruby on Rails

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/09/23 15:03

やりたいこと

最近Rails tutorialをやってみたので、簡単なクラウドファウンディングの画面を設計しています。
フォームにパラメータを入力、保存した後、別のオブジェクトに格納して表示する処理を実装しようとしています。

実装

下記のようなコードを書いています。
@postに入力された値を@cardの各パラメータに格納する形をイメージしています。
例えば、
title:猫
address:品川区
amount:100
messeage:nyao
の様な入力をすると、top.html.erbにパラメータが渡るような形です。

create_post.html.erb
これは、入力フォームの画面になります。

create_post.html.erb

1<h1>投稿を追加</h1> 2 3<%= form_for(@post) do |f| %> 4 <%= f.label :title, "title" %> 5 <%= f.text_field :title %> <br /> 6 7 <%= f.label :address, "address" %> 8 <%= f.text_field :address %> <br /> 9 10 <%= f.label :amount, "amount" %> 11 <%= f.number_field :amount %> <br /> 12 13 <%= f.label :message, "message" %> 14 <%= f.text_field :message %> <br /><br /> 15 16 <%= f.submit %> 17<% end %> 18 19<br /> 20<%= link_to '投稿一覧へ戻る', post_path %> 21

post_controller.rb
postに関するコントローラは以下の様になります
質問に直接関わるのは、@card.each do |card|の部分です。

class PostController < ApplicationController def post end def top # ダミーデータ @card = { "No.1" => {id:1, title:"漫画", address:"1111", amount:99999 , message:"1番の人だよ"}, } end def index @posts = Post.all end def create_post @post = Post.new end def create @post = Post.new(post_params) if @post.save @post.each do |post| @main_Title.push(post.title) @card = { card.id => {id: post.id , title:post.title, address:post.address, amount:post.amount , message:post.message}, } end redirect_to post_path, notice: "投稿に追加できました" else render :new end end private def post_params params.require(:post).permit(:title, :address, :amount, :message) end def card @currentId = params[:id] end end

top.html.erb
cardに格納されたデータを表示するページです
ダミーデータが表示されます。

<div class = "mainPosition"> <h1>プロジェクト一覧(新着順)</h1> <div class="postCards"> <% @card.each do |key,value| -%> <div class="postCard"> <div class = "mainTitle"> <h3> <%= value[:title] %> </h3> </div> <div class="postCardStatus"> <div class = "leftString"> <p>現在</p> <p><%= value[:amount] %></p> </div> <div class = "rightString"> <p>支援者</p> <p>9999人</p> </div> </div> </div> </div> <% end -%> </div>

確認できたこと

@card.each do |card|の部分をコメントアウトしてダミーデータが以下の様にtop画面に表示されていることが確認できました。
イメージ説明
また、postの値が保存されていることも確認できました。(見にくくてすいません)
イメージ説明
求める実装は、@card@postのパラメータを渡すことさえできれば実現しそうです。

エラー

create_postのフォームに入力後、top画面に遷移するはずですが次のエラーが出ました。
イメージ説明

@postがnilと認識されているのはなぜでしょうか?
また、この@cardにパラメータを渡す場所はここで機能しうるのでしょうか?

調べてみましたが、今の私には原因が見つかりませんでした。
何かの基礎的知識が抜けているのであれば、そのあたりをご指摘もらえると幸甚です。

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

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

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

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

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

guest

回答2

0

@postがnilってどこで言ってますか? はられたエラー画面では Postのインスタンスである と言ってます。他にある?

@postは複数あるわけではなく、一つですから eachしようがありません。
@postの値を@cardにいれるなら、eachは外して @post を直接渡してください。

ただ、@cardへいれるところが怪しげ。
というより、
@postの値をそのまま@cardに入れてるようです。@postのままviewで使うのでは問題があるのですか?

投稿2021/09/24 09:19

winterboum

総合スコア23567

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

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

0

eachは配列のデータに対して行えるもので、アクティブレコードのデータをeachで行えるものではありません。

おそらくeachはやめて、
@postのインスタンス変数に書き換えればいけるのでは??

ruby

1 2if @post.save 3 @main_Title.push(@post.title) 4 @card = { 5 card.id => {id: @post.id , title:@post.title, address:@post.address, amount:@post.amount , message:@post.message}, 6 } 7

投稿2021/09/23 18:03

tani__san929

総合スコア61

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問