Как разделить код между моделью и контроллером в Rails?

И моя модель Rails, и код контроллера должны записывать файлы в файловую систему.

Хочу объединить логику в один метод.

Как лучше всего использовать этот метод для разных моделей и контроллеров?

Спасибо!


person Crashalot    schedule 31.08.2009    source источник


Ответы (2)


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

person Matthew Vines    schedule 31.08.2009
comment
спасибо, Мэтью. проблема в том, что модели необходимо записать файл, содержащий содержимое вызова рендеринга. Другими словами, я пишу статическую версию на диск страницы, отображаемой Email :: Show. Что вы порекомендуете? - person Crashalot; 01.09.2009
comment
Я не уверен, что полностью понимаю, что вы пытаетесь достичь, но похоже, что ваш контроллер знает, что писать, и что это должно быть написано, и это нормально. Все, что вам нужно сделать, это использовать в вашей модели метод записи файлов, который может принимать данные, переданные от контроллера, и записывать их в файловую систему. Если я полностью упущу суть, дайте мне знать, и я сделаю все возможное, чтобы исправить свой ответ. - person Matthew Vines; 01.09.2009
comment
Хорошо, это может сработать. Мой вопрос: почему модель электронной почты должна знать пути к файлам и как записывать файлы, но не знать, как сгенерировать URL-адреса (скажем, для электронного письма требуется специальный токен и, следовательно, уникальный URL-адрес, по которому пользователь должен щелкнуть, чтобы удалить электронное письмо. )? В случае с URL-адресом я должен (я думаю) сгенерировать URL-адрес из контроллера или из представления и передать необходимые данные из модели электронной почты. Тем не менее, с файловой системой я передаю данные модели и должен генерировать путь к файлу (и файл) в модели электронной почты. Имеет ли это смысл? - person Crashalot; 01.09.2009
comment
Во-первых, я бы не стал сообщать своей модели, где сохранить файл, я бы поместил его в файл конфигурации или что-то в этом роде, чтобы его можно было изменить без перекомпиляции. - person Matthew Vines; 01.09.2009
comment
Во-вторых, я думаю, что разница в определенных обязанностях. Роль контроллера состоит в том, чтобы принять запрос от пользователя и выдать соответствующие команды модели и представлению для достижения желаемых результатов. Можно утверждать, что составление URL-адреса является частью этих обязанностей. В противном случае Контроллер является вашим командиром на поле боя, он знает, что делать для данного действия пользователя, и отдает приказы двум другим уровням, но на самом деле он не должен беспокоиться о том, как эта работа выполняется. - person Matthew Vines; 01.09.2009
comment
спасибо, Мэтью. проблема изменилась: я обрабатываю входящее сообщение через ActionMailer :: receive. этот метод вызывается через скрипт, запускаемый qmail, когда определенный пользователь получает электронную почту. к сожалению, изнутри модели ActionMailer у меня нет возможности получить доступ к render () к render_to_string () ... как я могу записать статический файл на диск без дублирования кода? - person Crashalot; 01.09.2009
comment
Я хотел бы увидеть пример кода вашей проблемы, чтобы я мог думать о ней в более конкретных терминах. Не могли бы вы опубликовать еще один вопрос или изменить этот. - person Matthew Vines; 01.09.2009

Если вам действительно нужно это сделать, вы можете поместить модуль в / lib и include его там, где это необходимо.

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

person jdl    schedule 31.08.2009
comment
спасибо, Мэтью. проблема в том, что модели необходимо записать файл, содержащий содержимое вызова рендеринга. Другими словами, я пишу статическую версию на диск страницы, отображаемой Email :: Show. Что вы порекомендуете? - person Crashalot; 01.09.2009
comment
Я бы порекомендовал сделать это, как рекомендует Radar, и передать строковое представление рендеринга в качестве параметра модели, которая затем запишет его в файл. Таким образом, контроллер решает, что рендерить, а модель решает, что с этим делать. - person Jeff Whitmire; 01.09.2009
comment
Спасибо, парни. проблема изменилась: я обрабатываю входящее сообщение через ActionMailer :: receive. этот метод вызывается через скрипт, запускаемый qmail, когда определенный пользователь получает электронную почту. к сожалению, изнутри модели ActionMailer у меня нет возможности получить доступ к render () к render_to_string () ... как я могу записать статический файл на диск без дублирования кода? - person Crashalot; 01.09.2009