web-dev-qa-db-ja.com

link_to、redirect_to、およびrenderの違いは何ですか?

Railsのlink_toredirect_torenderの主な違いについて混乱しています。誰でも説明してください。

31
Sami

link_toはビューで使用され、リンクのHTMLコードを生成します

<%= link_to "Google", "http://google.com" %>

これにより、ビューに次のHTMLが生成されます

<a href="http://google.com">Google</a>

redirect_toおよびrenderは、リクエストに応答するためにコントローラーで使用されます。コントローラーに追加した場合、redirect_toはリクエストを新しいURLにリダイレクトするだけです。

redirect_to "http://google.com"

あなたのページにアクセスする人は誰でも効果的にGoogleにリダイレクトされます

renderはさまざまな方法で使用できますが、主にHTMLビューをレンダリングするために使用されます。

render "article/show"

これにより、ビュー「app/views/article/show.html.erb」がレンダリングされます

次のリンクで、redirect_toとrenderメソッドについて詳しく説明します http://guides.rubyonrails.org/layouts_and_rendering.html

32
RedXVII

Documentation から:

ビューのレンダリングとリクエストのリダイレクトについて

。 。 。 renderは、Rails応答の構築に使用するビュー(または他のアセット)を指示します。redirect_toメソッドは、まったく異なる処理を実行します。ブラウザーに、異なるURLの新しいリクエストを送信するよう指示します。

ビューのレンダリングについて

。 。 。 render:actionはターゲットアクションでコードを実行しません。 。 。

リクエストのリダイレクトについて

。 。 。コードは実行を停止し、ブラウザへの新しいリクエストを待ちます。 HTTP 302ステータスコードを送り返すことで、ブラウザが次にどのようなリクエストを行う必要があるかを伝えたことがあるだけです。


基本的に:

link_toは、通常ビューで使用されるURLを生成するヘルパーメソッドです(。html.erbファイル)

renderは、データを(たとえば、フォームから)次のコントローラアクションに渡さずにビューをレンダリングするようにコントローラに指示します。

redirect_toは、302ページのリダイレクトを行い、データ(たとえば、フォームから)をWebアプリのコントローラーアクションまたは外部アプリ(ex :グーグル、フェイスブック、好きなウェブ記事など)

9
sargas

link_toは、ERBテンプレートで使用するためのものです。特定のパスまたはURLへのリンクを出力します。

redirect_toはコントローラーで使用するためのものです。コントローラーメソッドが終了すると、クライアントは指定されたパスまたはURLを要求します。

renderはコントローラーで使用するためのものでもあります。 Railsで指定されたテンプレートをレンダリングします。

redirect_torenderは、特定のコントローラーメソッドで1回だけ呼び出すことができます。

3
Mike Yockey

私は実際に これについてブログ投稿を書いただけです 。最も重要なビットを以下にコピーします(変更あり)。

コントローラメソッド:render対_redirect_to_

renderおよび_redirect_to_は、コントローラーアクションが終了する2つの方法です(一般的に言えば)。それらがどのように機能するかを理解するために、Railsアプリでコントローラーが行うことを確認しましょう。

  • ユーザーがページにアクセスしようとしました。
    http:// localhost:3000/books/index.html
  • 内部的には、ブラウザはサーバー上の指定されたパスに対してHTTPリクエストを送信します。
    (_GET /books/index.html_)
  • Railsルーティングシステムは、指定されたリクエストパスに対応するコントローラを検索します。
    books GET /books/index(.:format) books#index
  • コントローラーはいくつかのデータを準備してからクライアントに返送する応答(、つまりのHTTPヘッダー/ボディコンテンツ)をサーバーに伝えます

この最後のステップは、renderまたは_redirect_to_、または省略した場合は暗黙的にを呼び出すと明示的に発生します。

あれは、

_def index
  @books = Book.all
end
_

と同じです

_def index
  @books = Book.all
  render :index
end
_

_render :index_は、「準備したデータ(_@books = Book.all_)を_books/index.html.erb_ビューテンプレートと組み合わせて完全なHTMLドキュメントを生成し、それをに送り返しますクライアント。」

_redirect_to @book_は、「プロセス全体を最初からやり直すようクライアントに伝え、url_for(@book)に新しいGETリクエストを発行します.

両方を省略すると、アクションは、アクション自体と同じ名前のテンプレートをレンダリングします。つまり、必要なビューテンプレートがレンダリング元のアクションと一致しない場合にのみ、renderを明示的に呼び出す必要があります。

すべてのコントローラーアクションに対応するビューテンプレートがあるとは限らないことに注意してください。一般に、_#create_、_#update_、および_#destroy_(すべて非GET HTTPリクエストにルーティングされる)は、データベースに変更を加えてから、_redirect_to_いくつかのリソース(成功した場合)またはその前のフォームをre _renderし、エラー(失敗した場合)とともに。

公式ガイドが説明しているように (私の強調)、

これらの2つのメソッド[renderおよび_redirect_to_]は、アクションコントローラーで使用される2つの基本的なアクションアーキタイプを表します:Get-and-showおよびdo-and-redirect。ほとんどのアクションは、これらのテーマのバリエーションです。


メソッドの表示:render対_link_to_

renderは、ビューテンプレート内でも使用されます。完全なHTMLドキュメントを生成するのではなく、パーシャルビューテンプレートを大きなドキュメントに挿入するために使用されます。これがその結果です。

  • 標準テンプレートに挿入するpartial view templateファイルを作成できます(モジュラーページコンポーネントと考えてください)。
  • パーシャルのファイル名はアンダースコアで始まる必要があります(例:__nav.html.erb_)。
  • _render 'nav'_パーシャル同じフォルダにあるビューからを含める場合は、__nav.html.erb_を使用します。
  • パーシャルを_render 'shared/nav'_ プロジェクト内の任意のビューからに含める場合は、_app/views/shared/_nav.html.erb_を使用します。
  • データをパーシャルに渡したり、コレクションオブジェクトから複数のパーシャルをレンダリングしたりするためのさまざまなオプションと省略構文があります。詳細は ガイド を参照してください。

_link_to_は、アンカータグ(_a href_タグ)をビューテンプレートに挿入するための便利な方法です。リンク先のURLの多くはアプリケーション内の他のページであり、これらのURLは次のようにオブジェクトまたは「ヘルパーメソッド」を使用して参照できるため、これは便利です。

_= link_to 'Back', books_path   # renders as <a href="/books">Back</a>
= link_to 'View', @book        # renders as <a href="/book/1">View</a> or similar
_
2
Ryan Lue

A link_toはRails内のフォームで使用され、html内にリンク要素を作成するためのヘルパーです。他の2つはフォームでは使用されず、コントローラーで使用されます。

コントローラメソッドがそのページにリンクされている場合は、そのページをrenderします。例えば。 「new」を呼び出すと、「new item」ページがレンダリングされます。彼らはちょうどされたばかりの要求を満たします。

redirectはまさにそのために使用されます-リダイレクト。たとえば、ログインする必要があるページにアクセスしようとすると、ユーザーはログインページにリダイレクトされます。したがって、リダイレクトは基本的に新しいリクエストを生成します。

1
Kyri Elia

link_toは標準のHTMLアンカーを出力します=リンク (link_to documentation)

redirect_toは、更新や削除などのページ応答に一般的に使用されます。それはあなたがそれを与えるパラメータを取り、あなたのページを適切に導きます。 ((redirect_to documentation)

renderは、パーシャルのロードや特定の.erbファイルのロードに使用されます。 (render documentation)

this Railsガイドにはたくさんの例があります。これはレンダーとredirect_toを説明するはずです。link_toはレンダリングとredirect_toとはかなり異なります

1

Link_toは、HTMLに表示される特定のURLへのハイパーリンクを作成します。

Redirect_toは、特定のオプションに応じて、リンク先を決定します。たとえば、誰かがユーザーとしてログオンしている場合は、そのユーザーに設定ページを表示し、そうでない場合はリダイレクトページにリダイレクトすることができます。

レンダーは、チャンク全体を受信者に送信する前に、レンダリングされたファイルを開き、そのコンテンツを取得して既存のファイルに貼り付けます。

私が正しいと思います。

1
stonefruit

公式から Railsガイド

ご覧のように、レンダーはRailsどのビュー(または他のアセット)を使用して応答を作成するかを指示します。redirect_toメソッドは、まったく異なることを行います。ブラウザに新しいリクエストを送信するように指示します別のURL。
1
Agis