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

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

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

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

Q&A

解決済

1回答

620閲覧

Progate クローンTwitter 新規投稿の更新の仕方に納得できません。

NoBuNaGaa

総合スコア1

Ruby on Rails

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

0グッド

0クリップ

投稿2020/04/26 10:09

編集2020/04/26 10:42

プログラミング初心者です。
ruby on railsにおいて、アクションで定義した「@変数」をビューで@を使わずに「変数」と書いて使うことはできますか?

今progateをやっていてtwitterのクローンを作っています。
投稿一覧を表示しているHTMLがこちらです。

<% @posts.each do |post| %>

<div class="posts-index-item"> <%= link_to(post.content, "/posts/#{post.id}") %> </div> <% end %>

@postsにはデータベースにある全ての投稿たちが代入されています。

目標は投稿一覧の一番下に新規投稿を表示することです。
新規投稿をするために、createアクションを作って投稿画面から投稿一覧までリダイレクトするところまでは組めたのですが、受け取った入力を@post(sがない変数)に代入する理由が分かりません(答えは@post(sがない変数)に代入となっています)。
ちなみに@post(sがない変数)は投稿の詳細を表示するためのものです。

posts_controller.rb ファイルの一部↓
@post = Post.find_by(id: params[:id])

show.html.erb ファイル(投稿の詳細)の一部↓

<div class="posts-show-item"> <p> <%= @post.content %> </p> <div class="post-time"> <%= @post.created_at %> </div> </div>

each文の|post|に入力内容を代入しているのでしょうか?

説明の足りないところがあったら教えて頂きたいです。

回答よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • controller から view に渡す変数には @ をつける必要がある。
  • 詳細画面では、投稿の詳細を表示するため、@post に単体の投稿情報を格納して view へ渡す。
  • 一覧画面では、投稿一覧を表示するため、@posts にすべての投稿情報を格納して view へ渡す。

ということではないでしょうか?

投稿2020/04/26 10:16

tktcorporation

総合スコア108

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

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

NoBuNaGaa

2020/04/26 10:47

ご回答ありがとうございます! 一覧画面に新規投稿を表示させるために、@postsに受け取った入力を代入すべきだと考えたのですが答えは@postに代入となっているんですよね。 ご回答勘違いしていたら申し訳ないです。
tktcorporation

2020/04/26 10:59

@posts の値は db 管理されている。という前提での回答になります。 新規登録の流れ 1. post の情報が view から controller へ渡る 2. controller は 受け取った情報をもとに db へ post の情報を登録する 投稿情報表示の流れ - 一覧画面の場合 1. db から post の配列データを受けとり view へ @posts として渡す。 2. view で ループ処理を行い表示する - 詳細画面の場合 1. db から特定の post を取得し、view へ @post として渡す。 2. view で表示する。 --- こういった手順がおこなわれることになると思います。 > @postsに受け取った入力を代入すべき post の値は db 管理のはずなので、受け取った値を @posts に追加する、というようなことは行わないはずです。 > @postに代入となっているんですよね。 @post への代入は、保存処理のためではなく、表示処理のためではないかと思います。 post のデータ管理の方法で、勘違いされている部分があるのかなという印象を受けました!
NoBuNaGaa

2020/04/26 13:19

あ!@postはdbに保存するための媒体でしかないということでしょうか?! @postsは「dbから全部取ってきたもの」という定義だから一度dbにsaveされてしまえば一覧に仲間入りするってことですよね!
tktcorporation

2020/04/26 13:38

まさしくそんなかんじです! ひとつだけ訂正すると、 『@postsは「dbから全部取ってきたもの」という定義だから』 これは、そういう定義だから、ではなく、「そう定義したから」ですね。 ``` @posts = Post.all() # db から全てを取得する @posts = [1,2,3,4,5,6] # 数字の配列を代入する ``` 1行目の @posts は、「dbから全部取ってきたもの」ですが、 2行目の @posts は、「自分で作った数字の配列」です。 > 一度dbにsaveされてしまえば一覧に仲間入りするってことですよね! ここはそのとおりなので、この考え方で Progate のコード等をみてみると、納得できると思います!
NoBuNaGaa

2020/04/26 15:12

わーなるほど!! とてもすっきりしました! 感謝の気持ちでいっぱいです、ありがとうございました!!
tktcorporation

2020/04/26 15:28 編集

いえいえ!お役に立てたならよかったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問