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

Можно ли использовать 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 в представлении? Если нет, есть ли что-то еще, что я могу использовать? Спасибо за чтение.

4b9b3361

Ответ 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 перенаправлять.

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