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

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

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

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

8032閲覧

Ruby on Railsで入力した値を一時的に変数に保存する

testrails

総合スコア11

Ruby

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

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2017/11/19 11:57

編集2017/11/19 14:30

http://localhost:3000/posts/newへアクセスすると、ルーティングによって、new.html.erbを表示する

・new.html.erb
⇒nameとcontentを入力してsubmit

・posts_controller.rb
⇒new.html.erbで入力したnameとcontentを変数(@setting)に保存

・result.html.erb
⇒Controllerのredirect_to '/posts/result'によって、ここに来て@settingのnameとcontentを表示する

上記を実現したいと思っています。

下記に書けるとろこまで書いてみましたが、ダメでした。
ちなみに、入力した値をデータベースへ保存するまでの方法は知っていますが、
今回はデータベースへ保存したいわけではなく、ユーザーが入力した値を一時的にどこかに保存するのがゴールです。
お手数ですが、よろしくお願いいたします。

###new.html.erb

ruby

1<h1>テキスト入力</h1> 2 3<%= form_tag('posts_path') do |f| %> 4<%= text_field_tag :name %><br/> 5<%= text_field_tag :content %><br> 6<%= submit_tag "追加" %> 7<% end %>

###posts_controller.rb

ruby

1class PostsController < ApplicationController 2 def index 3 end 4 5 def show 6 end 7 8 def result 9 end 10 11 def new 12 end 13 14 def create 15 @setting = Hash.new 16 @setting.name = params[:name] 17 @setting.content = params[:content] 18 redirect_to '/posts/result' 19 end 20 21end

###result.html.erb

ruby

1<h1>結果表示</h1> 2 3<%= @setting.name %> 4<%= @setting.content %>

###routes.erb

ruby

1Rails.application.routes.draw do 2 get 'posts/index' 3 get 'posts/show' 4 get 'posts/result' 5 get 'posts/new' 6 post "posts" => "posts#create" 7end

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、View側ですがform_tagに指定する値が間違っています。
form_tag('posts_path')のように文字列を引数に渡してしまうと、
posts_pathというURLにフォームの値を送信してしまいます。
今回の場合、/postsというURLに送信したいので、以下のように設定する必要があります。

Ruby

1form_tag posts_path

メソッドの引数の括弧はあってもなくても、どちらでも問題ありません。
ちなみに上のコードは以下のように設定した場合と同じです。

Ruby

1form_tag '/post'

posts_pathというのはRailsのパス用のヘルパーメソッドで、
routes.rbで設定しているURLを返してくれる便利なメソッドです。
hoge_pathhogeの部分に設定する値は、以下のコマンドをコンソールで入力すれば確かめることができます。

$ bundle exec rake routes Prefix Verb URI Pattern Controller#Action posts_index GET /posts/index(.:format) posts#index posts_show GET /posts/show(.:format) posts#show posts_result GET /posts/result(.:format) posts#result posts_new GET /posts/new(.:format) posts#new posts POST /posts(.:format) posts#create

上のPrefixの部分がhoge_pathhogeに当てはまるところです。
最終的にnew.html.erbは以下のようになります。

<!-- new.html.erb --> <h1>テキスト入力</h1> <%= form_tag posts_path do |f| %> <%= text_field_tag :name %><br> <%= text_field_tag :content %><br> <%= submit_tag "追加" %> <% end %>

次にController側を見ていきます。PostのようなActive Recordはドット記法でアクセスできますが、
RubyのHashの場合はhash[:key]あるいはhash['key']のような形で値にアクセスします。

もしドット記法をRailsで使う場合は、Hash.newではなく、
ActiveSupport::OrderedOptionsを使用します。
※参考:ActiveSupport::OrderedOptions

Ruby

1@setting = ActiveSupport::OrderedOptions.new

また、ヘルパーメソッドを使用して以下のように引数にパラメータを設定することによって、
リダイレクト先にパラメータを渡すことができます。

Ruby

1redirect_to posts_result_url(name: @setting.name, content: @setting.content)

このposts_result_urlの部分はURL用のヘルパーメソッドです。
hoge_pathの場合は相対パスでしたがhoge_urlの場合は絶対パスを返してくれます。
この場合ホスト名/posts/resultというURLを返してくれます。
最終的にposts_controller.rbは以下のようになります。

Ruby

1# posts_controller.rb 2class PostsController < ApplicationController 3 def index 4 end 5 6 def show 7 end 8 9 def result 10 @setting = ActiveSupport::OrderedOptions.new 11 @setting.name = params[:name] 12 @setting.content = params[:content] 13 end 14 15 def new 16 end 17 18 def create 19 @setting = ActiveSupport::OrderedOptions.new 20 @setting.name = params[:name] 21 @setting.content = params[:content] 22 redirect_to posts_result_url(name: @setting.name, content: @setting.content) 23 # 以下のコードでも同じ動作をします 24 # redirect_to action: :result, name: @setting.name, content: @setting.content 25 end 26end

resultアクションでは受け取ったパラメータをViewで表示するため、@settingにパラメータを設定しています。

result.html.erbは修正する必要はありませんが、
routes.rbに全角スペースが入っているみたいなので、半角スペースに修正してください。

投稿2017/11/20 15:04

編集2017/11/20 15:08
gesorein

総合スコア101

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

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

testrails

2017/11/20 15:30

form_forやform_tag、指定する値を色々試行錯誤しましたがエラーが消えず、心が折れそうになっておりました。ヘルパーメソッド、ルーティングに関して、大変詳しく教えていただき大変感謝しております! また、ActiveSupport::OrderedOptionsに関しては、初耳でした。 参考URLは熟読させていただきます。 質問させていただいた件は解決しましたので、ベストアンサーとさせていただきます。 params[:hoge]という形はサンプルコードでよく出てくるのですが、正直まだ意味が分かっておらず、出てくるとビビってしまいます。また、ルーティングについても、なんでちゃんと動いているのか分からないことが多いので、この辺りも勉強いたします。 この度は、誠にありがとうございました。
gesorein

2017/11/21 01:00 編集

解決したようで良かったです! ちなみにparamsはフォームで送信した値にアクセスするためのものです。 たとえば、View側からhogeという名前でデータを送信した場合は、 Controller側でparams[:hoge]でアクセスできます。 フォームのヘルパーメソッドに関してはこちらが参考になります。 https://railsguides.jp/form_helpers.html ルーティングに関してはこちらが参考になります。 https://railsguides.jp/routing.html 送信した値はDBに保存してしまうことが多いので、 今回のようなことは実際のアプリケーションではあまりやらないですね。 もし体系的にRailsを学ぶなら以下の資料がおすすめです! https://railstutorial.jp/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問