永続化されていないデータから構築されたURLでメールビューを生成する特別なケースを処理する必要があります。Railsはto_paramに永続化されていなくても何かを返すようにします。
例:私のユーザが投稿を作成でき、それが投稿作成通知メールをトリガすると仮定して、偽の投稿作成の例を送信したいと思います。このために、私はFactoryGirl.build(:post)
を使用して、日常のRailsの生活の中で私のPostMailer.notify_of_creation(@post)
にこれを渡しています、我々は、引数としてモデル自体を渡すことで、ルートurl_helpers
を使用して、ルート・ジェネレータは自動的にするために、そのIDにモデルを変換しますarticle_path(@article)
で(ルートURLの生成に使用され、ルートヘルパーは/articles/:id
URLを構築するため@article.id
に@article
を変換します。
私はそれはActiveRecordの中に同じであると考えていますが、モデルが持続されていない場合は、とにかくMongoidで、この変換が失敗しました(これは実際のデータに対応しない可能性のあるURLの生成を防ぐのでやや良いです)
私の特定の場合、 URL生成クラッシュでそうモデルが保持されませんよう:
ActionView::Template::Error: No route matches {:action=>"show", :controller=>"posts", :post_id=>#<Post _id: 59b3ea2aaba9cf202d4eecb6 ...
と
<%= post_url(@post_not_persisted) %>
クラッシュを私はバイパスすることができます方法はあります非常に特定の範囲でのみ、この制限はありますか?そうでなければ私はresource_path(@model.id.to_s)
以上@model.class.name
ですべての私のresource_path(@model)
を置き換えることができますが、これは右のような状況のように感じることはありません...
EDIT:
主な問題は、私は強制する必要が
Foo.new.to_param # => nil
# whereas
Foo.new.id.to_s # => "59b528e8aba9cf74ce5d06c0"
ですモデルが永続化されていなくても、ID(またはその他のもの)を返すためにはto_param
を使用します。今私はスコープモンキーパッチを使用することができるかどうかを確認するために改良を見ていますが、より良いアイデアを持っている場合、私は私の洗練を使用するときに、小さな範囲の問題を持っているように見えるしかし
module ForceToParamToUseIdRefinement
refine Foo do
def to_param
self.class.name + 'ID'
end
end
end
:-)私のゲストしてくださいよurl_helpersに期待どおりにバブルアップしないためです。コンソールでのテーパリファインメントを使用してもうまく動作します(Foo.new.to_param # => 59b528e8aba9cf74ce5d06c0
)