Я путаюсь о главном различии между link_to
, redirect_to
и render
в Rails. любой может объяснить.
В чем разница между link_to, redirect_to и рендерингом?
Ответ 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