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

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

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

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

Ruby on Rails

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Q&A

解決済

1回答

3877閲覧

railsでセッション変数に入っている値をformに表示したい

widget11

総合スコア221

Ruby on Rails 5

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

Ruby on Rails

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

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

0グッド

1クリップ

投稿2020/01/10 08:30

いわゆるwizard形式のフォームを作成しています。
作りは簡単なものですが、パラメーターとして受け取ったものをsession変数に格納する。
戻るボタンを押したら、session変数に格納されている値を編集できるようformに表示するというものです。
しかし、実装しているのですがformに上手く値を表示できません。
現状つくりとしては以下のようになっております。

class StepsController < ApplicationController def first @account = Account.new end def second session[:name] = params[:name] @account = Account.new end . . . end
#first.html.erb <%= form_with(model: @performer, url: second_steps_path, method: :get, local: true) do |form| %> <%= form.label "名前" %> <%= form.text_field :name, value:"#{session[:name]}" %> <%= form.submit "次へ" %> <% end %>
#second.html.erb <%= form_with(model: @performer, url: third_steps_path,method: :get, local: true) do |form| %> <%= form.label "住所"%> <%= form.text_field :address, value:"#{session[:address]}" %> <%= form.submit "次へ" %> <% end %> <%= link_to "戻る", first_performer_steps_path %>

session変数はviewでも利用できるのでvalue:"#{session[:name]}"
のような形で変数を文字列としてvalueオプションに展開しております。
session変数に値が格納されているのでsecond.html.erbにある戻るボタンを押しても、session変数の中身が空にならないはずなのですが、何故かformは空で表示されてしまいます。
また少し気づいたのですが、戻るボタンを押してfirstにリダイレクトするとセッションの中身(urlパラメーターにあったもの)が消えています。
原因がわからないのですが、どうすれば良いでしょうか。
よろしくお願いします。

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

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

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

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

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

winterboum

2020/01/10 09:11

作りがよくわからないのですが、 session[:name],session[:address] はいつ設定されていますか?
widget11

2020/01/10 10:11

session[:address]はthirdというメソッドで定義されているのですが、今回は省略の為省いております。 session[:name]に関していえばsecondというアクションのsession[:name] = params[:name]という形で パラメーターを代入しております。 質問には書いていないのですが最後にconfirmというアクションがあり、そこでsessionの値をhashにまとめて確認画面という形で値を表示しています。 もしかしたら僕が勘違いしているのかもしれませんが、firstでもsessionを設定する必要性がある形でしょうか。 いったんsession変数に代入したらclearメソッドやnilを代入されるまで値は破棄されないイメージだったのですが。
winterboum

2020/01/10 12:03

ああ、すると first(この時はname初期空白、 → 何か入力)して 次へ second (address 初期空白) →  戻るで firstへ この時sessionの値を期待 ということですか?
guest

回答1

0

ベストアンサー

前置き

質問文のコードの掲載ミスだと思うのですが、コントローラ側で設定しているインスタンス変数は

rb

1@account = Account.new

なのに、Viewで使っているインスタンス変数名が

erb

1<%= form_with(model: @performer, ...) do |form| %>

で食い違っています。とりあえず @account の方が正しいものと仮定して回答します。

回答

セッションに値を保存するときの書き方に問題があります。
値が入っているのは「params の中の name」じゃなくて、「params の中の account の中の name」になってるはずです。
まずは binding.pry などを使って params の構造を確認することをオススメします。

最終的には、以下のようなコードに直せば動くと思います。

rb

1 def second 2 session[:name] = account_params[:name] 3 @account = Account.new 4 end 5 6 private 7 8 def account_params 9 params.require(:account).permit( 10 :name, 11 :address, 12 ) 13 end

投稿2020/01/30 06:47

shinoharat

総合スコア1676

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

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

widget11

2020/02/03 21:19

binding.pryで確認しましたらその通りでした笑 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問