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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

4197閲覧

Ruby on Railsの redirect_toとrenderの使い分けについて

dongw

総合スコア119

Ruby

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

Ruby on Rails

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

1グッド

1クリップ

投稿2017/04/08 09:02

Ruby on Railsにてログイン機能を作っています。

ログイン失敗時と成功時に画面遷移する設計です。

ネットで調べてみるとredirect_toはログイン成功時に
renderはログイン失敗時に記述されています。

そもそもの使い分けとしてredirect_toで統一したら何か問題があるのでしょうか?
flashメッセージを遷移後にする場合でもredirect_toのオプションとして1行で書けますよね?
対してrenederで画面だけを再描写しても、リロードすると元の画面に戻ったりと、イマイチ使い勝手が悪いように思えます。

要はrenderがどういう場面で威力を発揮するのか、がイマイチわからなかったので質問させてもらいます。
よろしくお願いします。

ke-bo👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

ログインフォームならともかく、ふつうの入力フォームでredirect_toを使って再入力させようとすると、入力したデータが全部消えてしまいます。「一度サーバに送られたデータ」を含めてフォームを作る必要があるので、そのデータを持っている箇所でrenderする必要があります。

投稿2017/04/08 09:07

maisumakun

総合スコア145183

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

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

dongw

2017/04/08 09:24

フォームでビューから送ったデータを再利用出来る、ということでしょうか? ログイン失敗時に"失敗した"フォームの内容を消さないようにしたりするということでしょうか? それぐらいしか思い浮かばないですが・・・
maisumakun

2017/04/08 09:27

動作としても、 render→実際にそこでHTMLを生成する redirect_to→HTTP 302でリダイレクトさせて、改めてブラウザが飛び先のページを取得する と、別な挙動になっています。
dongw

2017/04/10 03:53

redirect_toだと実際に失敗時にフォームの内容を残しておくことが出来ないのでしょうか? それとも難しくなるが出来るのでしょうか(renderの方が簡単にできるのは理解できました)
退会済みユーザー

退会済みユーザー

2017/04/10 22:09

横から失礼します。 sessionに値を入れたり、getパラメータを渡したりすれば出来ないことはないのですが、いずれも処理を複雑化してしまうので、renderの方が好まれます。
dongw

2017/04/12 05:35

なるほど、出来なくはないのですね。 やり方が簡単なのでrenderを使う、という認識でよいでしょうか
maisumakun

2017/04/12 05:53

「たまたまこの場合はどちらでも実行できなくはない」というだけで、本質的に異なる処理です。 「ドメインの違うサイトに飛ばす」とか「ログアウトしたのでクッキーを破棄して再読込したい」など、redirectが適切になる場面もあります。
guest

0

render

  • controllerのインスタンス変数は、そのままViewに渡される

redirect

  • controllerのインスタンス変数は、リダイレクト先で新たに生成

あとはURLです。renderで他のアクションのviewを指定しても、指定先ページのURLにはならずそのまま変化しませんが、redirectだとなります。

renderは、viewだけ

renderは、画面の描画のみを担います。
Viewだけ借りてくるか、処理自体を全く別のものにするか、という大きな違いになります。
二つのアプリ間で、viewを共有することも可能です。たとえば

render file: "/u/apps/warehouse_app/current/app/views/products/show"

のようにします。

js, xml, json..., といった形式で描画することもできます。

render json: @product

こちらに詳しいです。

redirectのほうが、大きいことをしていて、renderはアクションの中の、描画部分だけを担うという、並列ではない両者の関係が伝われば何よりです

http://ruby.studio-kingdom.com/rails/guides/layouts_and_rendering

投稿2017/04/11 10:30

編集2017/04/11 10:32
takeotakeo

総合スコア58

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

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

dongw

2017/04/13 01:07

回答ありがとうございます。 renderは本当に画面の描写だけをする、ということなんですね。 勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問