link_to() во флэш-памяти Rails

Когда пользователь не может войти в мое приложение Rails, я хотел бы указать ему страницу сброса пароля:

flash[:notice] = "Login failed.  If you have forgotten your password, you can #{link_to('reset it', reset_path)}"

Однако я не могу использовать link_to в контроллере. Как лучше всего это сделать, не смешивая контроллер и логику просмотра?

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


person Grandpa    schedule 21.10.2009    source источник


Ответы (3)


Я думаю, что самое распространенное решение — вставить ссылку на страницу сброса пароля прямо в форму входа, чтобы ваше флеш-сообщение вообще не касалось этого. Это также позволяет пользователю запрашивать сброс, не входя в систему.

Если вы хотите сделать это во флеш-сообщении, вы должны использовать url_for для построения ссылки вместо link_to.

В качестве альтернативы вы можете отобразить частичное сообщение вместо жесткого кодирования сообщения в своем контроллере.

flash[:error] = render_to_string(:partial => "shared/login_failed_message")

# in shared/_login_failed_message.html.erb
<%= "Login failed.  If you have forgotten your password, you can #{link_to('reset it', reset_path)}" %>
person Baldu    schedule 21.10.2009
comment
Спасибо - партиал именно то, что мне было нужно. - person Grandpa; 21.10.2009
comment
Я обнаружил, что это не работает (в Rails 3.1), потому что все выходные данные экранируются перед визуализацией. Таким образом, вы получаете что-то вроде списка, сохраненного в файле href=/teams/1David Tuite's Team/a. - person David Tuite; 21.07.2011
comment
Просто хотел указать альтернативное решение с использованием view_context - stackoverflow.com/questions/1332013/ - person Lenart; 04.04.2013

Сегодня лучшим ответом на этот вопрос может быть (взято с http://www.railsexperiments.com/using-helpers-inside-controllers)

flash[:notice] = "Login failed.  If you have forgotten your password, you can #{view_context.link_to('reset it', reset_path)}".html_safe
person Jan    schedule 17.09.2012
comment
К сожалению, это не работает в Rails 6. - person Tintin81; 01.06.2020

flash[:notice] = "Login failed.  If you have forgotten your password, you can <a href='#{url_for(reset_path)}'>reset it</a>"

Правильно, link_to — помощник представления. Пожалуйста, нам более общий способ построения ссылки, а-ля url_for

person Daniel Fischer    schedule 21.10.2009