【问题标题】:How to share code between model and controller in Rails?如何在 Rails 中的模型和控制器之间共享代码?
【发布时间】:2026-02-04 00:45:01
【问题描述】:

我的 Rails 模型和控制器代码都需要将文件写入文件系统。

我想将逻辑整合到一种方法中。

在模型和控制器之间共享此方法的最佳方式是什么?

谢谢!

【问题讨论】:

    标签: ruby-on-rails model-view-controller abstraction


    【解决方案1】:

    如果你真的需要这样做,你可以在 /lib 和include 需要的地方放置一个模块。

    但是,如果可能的话,您应该让您的模型来处理它。如果您能提供更多详细信息,将更容易引导您朝着正确的方向前进。

    【讨论】:

    • 谢谢,马修。问题是,模型需要编写一个包含渲染调用内容的文件。换句话说,我正在将Email::Show 呈现的页面的静态版本写入磁盘。你有什么推荐?
    • 我建议按照 Radar 的建议进行操作,并将渲染的字符串表示形式作为参数传递给模型,然后模型会将其写入文件。这样,控制器决定渲染什么,模型决定如何处理它。
    • 谢谢,伙计们。问题已经转移:我正在通过 ActionMailer::receive 处理入站消息。当某个用户收到电子邮件时,通过 qmail 运行的脚本调用此方法。不幸的是,在 ActionMailer 模型中,我无法访问 render() 到 render_to_string() ...如何将静态文件写入磁盘而无需复制代码?
    【解决方案2】:

    我认为控制器会将文件写入文件系统的实际执行推迟到模型。虽然允许控制器决定何时执行该代码,但它不应对其实现负责,因此该代码实际上应该只在模型中。

    【讨论】:

    • 谢谢,马修。问题是,模型需要编写一个包含渲染调用内容的文件。换句话说,我正在将Email::Show 呈现的页面的静态版本写入磁盘。你有什么推荐?
    • 我不确定我是否完全理解您要完成的工作,但您的控制器似乎知道要写什么并且应该写,这很好。您需要做的就是在模型中使用文件写入方法,该方法可以获取从控制器传入的数据并将其写入文件系统。如果我完全没有抓住重点,请告诉我,我会尽力纠正我的回答。
    • 好的,可以。我的问题是:为什么电子邮件模型应该知道文件路径以及如何写出文件,却不知道如何生成 URL(例如,电子邮件需要一个特殊的令牌,因此需要用户单击以删除电子邮件的唯一 URL )?在 URL 的情况下,我应该(我认为)从控制器或视图生成 URL,并从电子邮件模型中传递必要的数据。然而,对于文件系统,我将数据传递给模型并应该在电子邮件模型中生成文件路径(和文件)。这有意义吗?
    • 首先,我不会让我的模型知道将文件保存在哪里,我会将它放在配置文件或类似性质的文件中,这样就可以在不重新编译的情况下对其进行更改。跨度>
    • 第二,我认为区别在于定义的职责。控制器的作用是接受用户的请求,向模型和视图发出适当的命令,以达到预期的结果。可以说,这些责任的一部分是将 URL 放在一起。否则,控制器就是你在战场上的指挥官,它知道对给定的用户操作要做什么,并向其他两层发出命令,但它实际上不应该关心这项工作是如何完成的。