Подтвердить что ты не робот

В чем разница между link_to, redirect_to и рендерингом?

Я путаюсь о главном различии между link_to, redirect_to и render в Rails. любой может объяснить.

4b9b3361

Ответ 1

link_to используется в вашем представлении и генерирует html-код для ссылки

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

Это создаст в вашем представлении следующий html

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

redirect_to и рендер используются в вашем контроллере для ответа на запрос. redirect_to просто перенаправляет запрос на новый URL-адрес, если в вашем контроллере вы добавите

redirect_to "http://google.com"

любой доступ к вашей странице будет эффективно перенаправлен в Google

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

render "article/show"

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

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

Ответ 2

Из Документация:

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

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

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

., render: действие не запускает какой-либо код в целевом действии.,.

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

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


В принципе:

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

link_to выведет стандартный html anchor = ссылку (ссылка на документацию)

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

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

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

Ответ 6

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

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

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

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

Ответ 7

Из официальных Rails-руководств:

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

Ответ 8

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

Методы контроллера: render vs. 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 (которые перенаправлены на HTTP-запросы не для GET) пытаются внести некоторые изменения в базу данных, а затем либо redirect_to некоторый ресурс (если он преуспел), либо re render предшествующую ему форму вместе с любыми ошибками (если она не удалась).

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

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


Методы просмотра: render vs. link_to

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

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