Скажем, у меня есть модель Rails под названием Thing. У Thing есть атрибут url, который по желанию можно установить как URL где-то в Интернете. В коде представления мне нужна логика, которая делает следующее:
<% if thing.url.blank? %>
<%= link_to('Text', thing_path(thing)) %>
<% else %>
<%= link_to('Text', thing.url) %>
<% end %>
Эта условная логика в представлении некрасива. Конечно, я мог бы создать вспомогательную функцию, которая изменила бы представление на это:
<%= thing_link('Text', thing) %>
Это решает проблему многословия, но я бы действительно предпочел иметь функциональность в самой модели. В этом случае код представления будет:
<%= link_to('Text', thing.link) %>
Для этого, очевидно, потребуется метод связи на модели. Вот что это должно было бы содержать:
def link
(self.url.blank?) ? thing_path(self) : self.url
end
Кстати, thing_path () - это неопределенный метод внутри кода модели. Я предполагаю, что в модель можно добавить некоторые вспомогательные методы, но как? И есть ли реальная причина, по которой маршрутизация работает только на контроллере и уровне просмотра приложения? Я могу вспомнить множество случаев, когда коду модели может потребоваться URL-адреса (интеграция с внешними системами и т. Д.).
источник
Ответы:
В Rails 3, 4 и 5 вы можете использовать:
например
источник
:host
варианта везде и установите его один раз в конфигурационных файлах вашей среды:Rails.application.routes.default_url_options[:host] = 'localhost:3000'
include Rails.application.routes.url_helpers
у меня работает в Rails 4.1Я нашел ответ относительно того, как сделать это сам. Внутри кода модели просто поместите:
Для Rails <= 2:
Для Rails 3:
Это волшебным образом
thing_path(self)
возвращает URL для текущей вещи илиother_model_path(self.association_to_other_model)
возвращает какой-то другой URL.источник
include Rails.application.routes.url_helpers
Вы также можете найти следующий подход чище, чем каждый метод:
источник
undefined local variable or method 'url_helpers' for Event:Class
об ошибке ... :(undefined method url_helpers
. Что я буду делать?class
, как показано в ответе. Если ваш класс Model уже расширяется,< ApplicationRecord
это не сработает?Любая логика, связанная с тем, что отображается в представлении, должна быть делегирована вспомогательному методу, так как методы в модели предназначены исключительно для обработки данных.
Вот что вы могли бы сделать:
источник
Мне очень нравится следовать чистому решению.
Это из http://hawkins.io/2012/03/generating_urls_whenever_and_wherever_you_want/
источник
Хотя мог бы быть способ, которым я склонен держать такую логику вне Модели. Я согласен с тем, что вы не должны помещать это в представление ( сохранять его скиновым ), но если модель не возвращает URL-адрес как часть данных в контроллер, то маршрутизация должна быть в контроллере.
источник
(Изменить: Забудь мою предыдущую болтовню ...)
Хорошо, могут быть ситуации, когда вы переходите либо к модели, либо к другому URL-адресу ... Но я не думаю, что это относится к модели, вид (или, возможно, модель) звучит более подходящим.
О маршрутах, насколько я знаю, маршруты предназначены для действий в контроллерах (которые обычно «магически» используют представление), а не непосредственно к представлениям. Контроллер должен обрабатывать все запросы, представление должно представлять результаты, а модель должна обрабатывать данные и передавать их представлению или контроллеру. Я слышал, что много людей здесь говорят о маршрутах к моделям (до такой степени, что я начинаю верить в это), но, насколько я понимаю, маршруты идут к контролерам. Конечно, многие контроллеры являются контроллерами для одной модели и часто называются
<modelname>sController
(например, «UsersController» является контроллером модели «User»).Если вы обнаруживаете, что пишете отвратительное количество логики в представлении, попробуйте переместить логику куда-то более подходящую; Логика запросов и внутренней связи, вероятно, принадлежит контроллеру, логика, связанная с данными, может быть размещена в модели (но не логика отображения, которая включает теги ссылок и т. д.), а логика, которая связана исключительно с отображением, будет помещена в помощник.
источник