我需要处理一个特殊情况,即使用由非持久数据构造的 URL 生成电子邮件视图。
示例:假设我的用户可以创建帖子,并触发帖子创建通知电子邮件,我想向用户发送虚假帖子创建的示例。为此,我正在使用 aFactoryGirl.build(:post)
并将其传递给我的PostMailer.notify_of_creation(@post)
在日常的 Rails 生活中,我们url_helpers
通过传递模型本身作为参数来使用路由,并且路由生成器会自动将模型转换为它的 ID 以用于路由 URL 生成(在 中article_path(@article)
,路由助手转换@article
为@article.id
用于构造/articles/:id
URL。
我相信它在 ActiveRecord 中是相同的,但无论如何在 Mongoid 中,如果模型没有持久化,这种转换就会失败(这有点好,因为它可以防止生成可能与实际数据不对应的 URL)
因此,在我的特定情况下,由于模型未持久化,URL 生成会崩溃:
<%= post_url(@post_not_persisted) %>
崩溃
ActionView::Template::Error: No route matches {:action=>"show", :controller=>"posts", :post_id=>#<Post _id: 59b3ea2aaba9cf202d4eecb6 ...
有没有办法只能在非常特定的范围内绕过这个限制?否则我可以替换所有我resource_path(@model)
的resource_path(@model.id.to_s)
或更好的@model.class.name
,但这感觉不是正确的情况......
编辑 :
主要问题是
Foo.new.to_param # => nil
# whereas
Foo.new.id.to_s # => "59b528e8aba9cf74ce5d06c0"
to_param
即使模型没有保留,我也需要强制返回 ID(或其他内容)。现在我正在研究改进,看看我是否可以使用范围猴子补丁,但如果你有更好的想法,请成为我的客人 :-)
module ForceToParamToUseIdRefinement
refine Foo do
def to_param
self.class.name + 'ID'
end
end
end
但是,在使用我的改进时,我似乎遇到了一个小范围问题,因为这并没有像 url_helpers 预期的那样冒泡。虽然在控制台中使用 te 细化时它工作正常(Foo.new.to_param # => 59b528e8aba9cf74ce5d06c0
)