Можно ли использовать redirect_to в представлении в RoR?
В моем приложении у меня есть небольшая коробка, которая появляется на каждой странице, проверяя статус запросов, сделанных пользователем. Если запрос принимается в любое время, пользователь автоматически должен быть доставлен на определенную страницу. Это мой код:
<% offersMade.each do |w| %>
<% if w.accepted == true %>
<% redirect_to offer_path(:email => "[email protected]") %>
<% end %>
<% end %>
Но я получаю эту ошибку:
undefined method `redirect_to' for #<ActionView::Base:0x1042a9770>
Не удается ли пользователю redirect_to в представлении? Если нет, есть ли что-то еще, что я могу использовать? Спасибо за чтение.
Ответы
Ответ 1
redirect_to - это метод ActionController:: Base Class, поэтому вы не можете использовать его в ActionView.
Вы можете попробовать выполнить
<% if w.accepted == true %>
<script type="text/javascript">
window.location.href="/logins/sign_up" // put your correct path in a string here
</script>
<% end %>
Отредактировано для параметра электронной почты
window.location.href="/logins/sign_up?email=<%= w.email %>"
Извините, я не знаю, есть ли что-нибудь в рубине для этого.
Ответ 2
Если вы хотите использовать redirect_to из представления, выполните этот метод:
Синтаксис : <% controller.redirect_to path% >
Пример: <% controller.redirect_to users_profile_path% >
Ответ 3
Код в представлении может быть перемещен в контроллер, который сделает доступным redirect_to.
class ApplicationController < ActionController::Base
before_action :check_for_accepted_offer
def check_for_accepted_offer
if Offer.any? { |o| o.accepted }
redirect_to offer_path(:email => "[email protected]")
end
end
end
Если OP захочет немедленно изменить URL-адрес при принятии предложения, ни один из приведенных в ответах Ruby-кода не поможет, потому что он оценивается только при загрузке страницы. OP необходимо будет настроить какой-либо опрос или нажать стратегию, чтобы предупредить браузер, когда предложение было принято, а затем использовать схему перенаправления JavaScript, опубликованную в другом ответе:
window.location.href="/logins/sign_up?email=<%= w.email %>"
Хотя это не отвечает на вопрос: "Как я могу использовать redirect_to в представлении", я думаю, что этот ответ в конечном счете был бы более полезен для OP. Я наткнулся на кого-то, используя этот ответ, чтобы перенаправить на другую страницу, когда перенаправление должно было быть выполнено в контроллере.
Ответ 4
redirect_to
не является методом ActionView
. Его метод ActionController
. Вероятно, вы можете использовать Javascript window.location.href при загрузке страницы или какое-то другое событие, чтобы перевести пользователя на другую страницу.
Ответ 5
Да, вы можете вызвать controller.redirect_to
из своего представления, чтобы получить то, что хотите, без необходимости отрисовки всего ответа, а затем использовать javascript на клиенте для создания нового запроса.
В вашем примере это будет выглядеть так:
<% offersMade.each do |w| %>
<% if w.accepted == true %>
<% controller.redirect_to offer_path(:email => "[email protected]") %>
<% end %>
<% end %>
Обратите внимание, что этот controller.redirect_to
не выйдет из вашего цикла, поэтому вы, вероятно, захотите break
, и вы, вероятно, захотите убедиться, что остальная часть вашего представления будет только условно отображена, если вы не сделали этого, t перенаправлять.
(Отказ от ответственности: я не обязательно соглашаюсь с этой техникой. Вам было бы лучше сделать это в своем контроллере или помощнике, как упомянули другие.)