в чем разница между link to, redirect to и render?

меня смущает основное различие(ы) среди link_to, redirect_to и render в рельсы. кто-нибудь может, пожалуйста, объяснить.

8 ответов


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

рендеринг можно использовать многими способами, но это в основном, используется для отображения HTML-представлений.

render "article/show"

это отобразит представление " app/views/article / show.формат html.erb"

следующая ссылка Более подробно объяснит redirect_to и методы рендеринга http://guides.rubyonrails.org/layouts_and_rendering.html


с документация:

относительно рендеринга представления против перенаправления запроса

. . . render сообщает Rails, какое представление (или другой актив) использовать при построении ответа. Метод redirect_to делает что-то совершенно другое: он сообщает браузеру отправить новый запрос на другой URL-адрес.

о предоставлении вида

. . . render: действие не выполняется любой код в целевом действии . . .

относительно перенаправления запроса

. . . Ваш код останавливается и ждет нового запроса для браузера. Просто так получилось, что вы сказали браузеру, какой запрос он должен сделать дальше, отправив обратно код состояния HTTP 302.


по сути:

link_to - это вспомогательный метод, чтобы генерировать URL-адреса, как правило, используется в ваши взгляды (.формат html.Эрб файлы)

оказать говорит ваш контроллер для отображения без передачи каких-либо данных (скажем, из формы) к следующему действию.

redirect_to делает перенаправление страницы 302, передавая данные (скажем, из формы) либо в действие контроллера в вашем веб-приложении, либо во внешнее приложение (например: google, facebook, веб-статья, которая вам понравилась, и т. д.)


link_to для использования в шаблонах ERB. Он выводит ссылку на определенный путь или url-адрес.

redirect_to предназначен для использования в контроллерах. Это заставляет клиента запрашивать указанный путь или url-адрес после выхода метода контроллера.

render также для использования в контроллерах. Это заставляет Rails отображать указанный шаблон.

redirect_to и render может вызываться только один раз в данном методе контроллера.


я на самом деле просто написал сообщение в блоге об этом. Наиболее важные биты копируются ниже (с изменениями).

Контроллер Методы: render и redirect_to

render и redirect_to это два способа, которыми заканчиваются действия контроллера (вообще говоря). Чтобы понять, как они работают, давайте рассмотрим, что делают контроллеры в приложении 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 говорит: "скажите клиенту, чтобы он начал весь процесс заново, выдав новый GET запрос url_for(@book).

если вы опустите оба, действие отобразит шаблон с тем же именем, что и само действие. Другими словами, вам нужно только позвонить render явно, когда шаблон представления, который вы хотите, не соответствует действию, из которого вы его рендеринг.

обратите внимание, что не каждое действие контроллера имеет соответствующий вид шаблон. В общем,#create, #update и #destroy (которые все направлены на не -GET HTTP-запросы) попытаться внести некоторые изменения в базу данных, а затем либо redirect_to некоторый ресурс (если это удалось) или re -render форма, которая предшествовала ему, вместе с любыми ошибками (если это не удалось).

как объясняют официальные гиды (выделено мной),

эти два метода [render и redirect_to] представляют два основных архетипа действий, используемых в действии контроллеры:Get-and-show и do-and-redirect. Большинство действий являются вариациями на эту тему.


Посмотреть Способами: render и link_to

render также используется в самих шаблонах представления. Вместо создания полного HTML-документа он используется для вставки частичный вид шаблона в большую. Вот результат:

  • вы можете создать частичный вид шаблона файлы, которые будут вставлены в стандартные шаблоны (подумайте о них как о модульных компонентах страницы).
  • имена файлов частичных элементов должны начинаться с подчеркивания (например, _nav.html.erb).
  • использовать render 'nav' если вы хотите включить _nav.html.erb частичная из представления, расположенного в той же папке.
  • использовать render 'shared/nav' если вы хотите включить частичный at 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

A link_to используется в форме в rails и является помощником для создания элемента ссылки в html. Два других не используются в формах, а скорее используются в контроллерах.

вы render страница, если метод контроллера связан с этой страницей. Например. вызов " new "должен отображать страницу "new item". Они выполняют только что высказанную просьбу.

redirect используется именно для этого - паразитов. Например, если вы пытаетесь получить доступ к странице, где вы должны быть войдя в систему, вы перенаправляете пользователя на страницу входа. Таким образом, перенаправления в основном порождают новый запрос.


link_to выведет стандартный HTML-якорь=ссылка (link_to documentation)

redirect_to обычно используется для ответов на страницы, таких как update и delete. Он будет принимать параметры, которые вы ему даете, и будет направлять вашу страницу соответствующим образом. (redirect_to documentation)

render используется для загрузки частичных или конкретных загрузок .erb файлы в другие. (рендер документация)

Есть куча примеров на этой направляющая рельсов, которая должна объяснить рендеринг и redirect_to. link_to сильно отличается от рендеринга и redirect_to


a link_to создает гиперссылку на определенный URL, который отображается в HTML.

redirect_to решит, куда вас связать, в зависимости от определенных параметров. Например, если кто-то вошел в систему как пользователь, вы можете показать ему его страницу настроек, иначе redirect_to на домашнюю страницу.

рендер откроет отрисованный файл, возьмет его содержимое и вставит его в существующий файл, прежде чем отправить весь кусок получателю.

надеюсь, что я право.


официальный рельсы направляющие:

как вы видели, render сообщает Rails, какой вид (или другой актив) использовать при построении ответа. Метод redirect_to делает что-то совершенно другое: он сообщает браузеру отправить новый запрос на другой URL-адрес.