it-swarm.com.ru

в чем разница между link_to, redirect_to и render?

Меня смущает основное различие (я) между link_to, redirect_to и render в Rails. Кто угодно может объяснить.

28
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.

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

render "article/show"

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

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

31
RedXVII

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

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

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

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

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

По поводу перенаправления запроса

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


В принципе:

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

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

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

9
sargas

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

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

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

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

3
Mike Yockey

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

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

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

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


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

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

  • Вы можете создавать файлы частичного представления 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

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

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

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

1
Kyri Elia

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

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

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

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

1
Nathaniel Johnson

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

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

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

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

1
stonefruit

Из официальных Рельсовые направляющие :

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